正則表達(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)始匹配,必須要完全匹配;match和search區(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'}