Python正則表達(dá)式

正則表達(dá)式(Regular Expression)是一個(gè)特殊的字符序列,用于檢查一個(gè)字符串是否與某種模式匹配。在Linux操作系統(tǒng)上,正則表達(dá)式可以應(yīng)用的命令有:grep、sed、awk。

常用的元字符

. : 匹配任意一個(gè)字符,除了換行符號(hào),換行符使用[.\n]模式;

\:轉(zhuǎn)義字符,使后一個(gè)字符改變?cè)瓉?lái)的意思;

*:重復(fù)匹配0次或更多次;

*?:非貪婪匹配,盡可能少匹配,可能匹配0次;

+:重復(fù)匹配1次或更多次;

+?:非貪婪匹配,盡可能少匹配,最少匹配1次;

?:重復(fù)匹配0次或1次;

^:以...開(kāi)頭;

$:以...結(jié)尾;

|:或;

{}:{n}匹配n次,{n,m}匹配n至m次,{n,}匹配至少n次最多無(wú)限次;

[]:字符集,對(duì)應(yīng)的位置可以是字符集中任意字符,[abc]表示匹配abc中任意字符,[^abc]表示匹配abc之外的任意字符;

():分組表達(dá)式作為一個(gè)整體,可以后接數(shù)量詞,表達(dá)式中的|僅在該組中有效;

預(yù)定義字符集

  • \d:匹配一個(gè)數(shù)字字符;

  • \D:匹配一個(gè)非數(shù)字字符;

  • \w:匹配包括下劃線的任何單詞字符;

  • \W:匹配任何非單詞字符;

  • \b:匹配\w和\W之間,即匹配單詞邊界匹配一個(gè)單詞邊界,也就是指單詞和空格間的位置;

  • \B:[^\b];

  • \s:匹配任何空白字符,包括空格、制表符、換頁(yè)符等等;

  • \S:匹配任何非空白字符;

  • \A:僅匹配字符串開(kāi)頭;

  • \Z:僅匹配字符串結(jié)尾;

單次匹配

match(), search(), fullmatch()都是從頭開(kāi)始匹配:

  • match():只檢測(cè)字符串開(kāi)頭位置是否匹配,匹配成功才會(huì)返回結(jié)果,否則返回None;

  • search():會(huì)掃描整個(gè)字符串并返回第一個(gè)成功的匹配;

  • fullmatch():匹配整個(gè)的字符串或文本,但是同樣是從頭開(kāi)始匹配,必須要完全匹配;

  • matchsearch區(qū)別:也就是說(shuō)match()必須是從開(kāi)頭開(kāi)始匹配,search()可以是從任意位置開(kāi)始匹配;

import re

obj = re.compile('^\w+')
result1 = obj.match('hello  hello')
print(result1)

# 也可以編譯和匹配同時(shí)進(jìn)行
result2 = re.match('.*', 'hello')

# re.search( ):搜索匹配一次,返回一個(gè)match對(duì)象,可以不是從頭開(kāi)始匹配
obj = re.compile('^h?')
result3 = obj.search('hhhhllo hello')
print(result3)

# re.fullmatch( ):匹配整個(gè)的字符串或文本,但是同樣是從頭開(kāi)始匹配, 必須要完全匹配
obj = re.compile('.*')
result3 = obj.fullmatch('hhhhllo hello')
print(result3)

全部匹配

  • compile:將一個(gè)字符串編譯為字節(jié)代碼;
import re

obj = re.compile('h\w+o')
  • findall:匹配多次,返回string中所有與pattern相匹配的全部字串,返回形式為列表;
import re
obj = re.compile('h\w+o')
result = obj.findall('123 你好 hello hello hello')
print(result)  # 返回列表

輸出:

['hello', 'hello', 'hello']
  • finditer:返回string中所有與pattern相匹配的全部字串,返回形式為迭代器;
import re
obj = re.compile('\w+')
result2 = obj.finditer('hello hello hello')
print(result2) # 返回迭代器

輸出:

<callable_iterator object at 0x0000000002937D88>
  • sub:全文替換,第四個(gè)參數(shù)指定替換個(gè)數(shù);
import re
s = '''python|hello|xkd|valor|opt|python|python'''
obj = re.compile("p\w+n")
ret = obj.sub("robby",s)
print(ret)

# 表示只替換一次
ret1 = obj.sub("robby",s,1)
print(ret1 )
  • split:表示使用regex分割字符串,返回一個(gè)列表;
import re
s = '''python|hello|xkd|valor|opt|python|python'''
obj = re.compile("x\w+d")

result = obj.split(s)
print(result)

分組

  • 普通分組:返回一個(gè)元組,索引從1開(kāi)始,索引為0時(shí)表示返回正則表達(dá)式匹配到的所有的內(nèi)容;
import re
s = """xkd|oc|c++|python|linux|java|swift|ruby"""
obj = re.compile('(x\w+d).*(p\w+n)')

result = obj.search(s)
print(result)

print(result.groups())  # 返回元組
print(result.group(1))  # 返回第一個(gè)分組匹配到內(nèi)容
print(result.group(2))  # 返回第二個(gè)分組匹配到內(nèi)容
print(result.group(0))  # 返回正則表達(dá)式匹配到的所有的內(nèi)容

輸出:

<re.Match object; span=(0, 17), match='xkd|oc|c++|python'>
('xkd', 'python')
xkd
python
xkd|oc|c++|python
  • 命名分組:groups()方法返回元組,groupdict()方法返回字典;
import re
s = """xkd|oc|c++|python|linux|java|swift|ruby"""

obj = re.compile('(?P<org>x\w+d).*(?P<course>p\w+n)')
result = obj.search(s)
print(result)

print(result.groups())# 返回元組
print(result.groupdict())   # 返回字典

輸出:

<re.Match object; span=(0, 17), match='xkd|oc|c++|python'>
('xkd', 'python')
{'org': 'xkd', 'course': 'python'}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容