正則表達式,regular expression, 縮寫為regex regexp re等
分類:BRE ERE PCRE python使用SRE
基本語法:
元字符metacharactor
. 匹配任意(除換行符)
[xx] 占一位,匹配括號里任一字符
[^x] 占一位,不匹配括號里任一字符
[a-z] 匹配任一位小寫字母
\b 匹配單詞邊界
\B 不匹配單詞的邊界
\d ==[0-9]
\D 匹配一位非數字
\s ==[\f\r\n\t\v]匹配一位空白字符
\S 匹配一位非空白字符
\w 匹配[a-zA-Z0-9_],包括中文的字
\W 匹配\w之外的字符
\ 轉義符號,例如 \\ \. \r \n \[ \]
重復
* 前面的正則表達式 重復0或多次
+ 前面的正則表達式 重復1或多次
?前面的正則表達式 重復0或1次
{n} 前面的正則表達式 重復n次
{n,} 前面的正則表達式 至少重復n次
{n,m} 前面的正則表達式 至少重復n到m次
或匹配
x|y 匹配x或y 長的在前 短的在后
分組 捕獲
(pattern) 自動分組從1開始
\數字 匹配分組 如 (very)\1 捕獲 very very
(?:pattern) 不分組 只改表優先級
(?<name>pattern) 或 (?’name’ exp) 命名分組
斷言
(?=exp) 斷言后面跟著exp
(?<=exp) 斷言前面跟著exp
(?!exp) 斷言后面不是exp
(?<!exp) 斷言前面不是exp
注釋
(?#comment) f(?=oo)(?#這個后斷言不捕獲)
貪婪和非貪婪
*? 匹配任意次 盡可能少重復
+? 匹配至少1次 盡可能少重復
?? 匹配0或1次 盡可能少重復
{n,}? 匹配至少n次 盡可能少重復
{n,m}? 匹配至少n次 至多m次 盡可能少重復
引擎選項
re.I 忽略大小寫
re.M 多行模式 ^行首 $行尾
re.S 單行模式,匹配所有字符包括\n
re.X 忽略表達式中的空白字符,如果要用可以轉義
#Python正則表達式 re模塊
import re
#re.match(pattern, string, flag=0) 只從頭開始
print(re.match(‘www’, ‘awww.runoob.com’))
print(re.match(‘www’, ‘www.runoob.com’).span())
#group(num) groups() 獲取小組,返回元組 group(‘name’)取分組
line = “Mei is a nice girl”
matchObj = re.match(r'(.*) is a (?P<ll>\w+) .*’, line, re.M|re.I)
if matchObj:
print(matchObj.group())
print(matchObj.group(1))
print(matchObj.group(‘ll’))
else:
print(“No match!”)
#re.search(pattern, string, flag=0) 掃描整個字符串返回第一個匹配的
print(re.search(‘www’, ‘www.runoob.com’))
print(re.search(‘com’, ‘www.runoob.com’).span())
#re.sub(pattern, repl, string, count=0, flag=0) 替換
# 參數:
# pattern : 正則中的模式字符串。
# repl : 替換的字符串,也可為一個函數。
# string : 要被查找替換的原始字符串。
# count : 模式匹配后替換的最大次數,默認 0 表示替換所有的匹配。
phone = “2004-959-559 # 這是國外電話”
#刪除字符串中的注釋
print(re.sub(r’#.*$’, ”, phone))
#刪除非數字字符串
print(re.sub(r’\D’,”,phone))
#repl參數是一個函數
def double(matched):
value = int(matched.group(‘value’))
return str(value * 2)
s = ‘A12D5JHK78’
print(re.sub(‘(?P<value>\d+)’, double, s))
#re.compile 編譯正則表達式,給match()和search()使用
# re.compile(pattern[, flags])
pattern = re.compile(r’\d+’)
m = pattern.match(‘one12two’,3)
print(m)
print(m.group())
print(m.start())
print(m.end())
print(m.span())
#findall 匹配所有子串 返回列表
# findall(string[, pos[, endpos]])
pattern = re.compile(r’\d+’)
result1 = pattern.findall(‘gan is 23 tag 45’)
result2 = pattern.findall(‘gan is 23 tag 45’, 0, 10)
print(result1)
print(result2)
#re.finditer 與findall類似,匹配所有子串,返回迭代器
#re.finditer(pattern, string, flag=0)
it = re.finditer(r”\d+”, “12a32bc43jf3″)
print(it)
for match in it:
print(match.group())
#re.split 按照匹配的子串將字符串分割返回列表
#re.split(pattern, string[, maxsplit=0, flags=0])
s = ‘ nike is, a. like/ ‘
print(re.split(‘\W+’, s))
#練習題
#匹配郵箱
emails = ‘test@hot-mail.com is his working-email’
pattern = re.compile(‘\w+[-\.\w]+@[\w-]+(\.[\w-]+)+’)
print(pattern.findall(emails))
#匹配html標記內的內容
alink = ‘<a href=”http://www.baidu.com”>百度</a>’
print(re.findall(‘<[^<>]+>(.*)<[^<>]+>’, alink))
#匹配url
print(re.findall(”’href=[‘”](?P<alink>.*)[‘”]”’, alink))
#匹配二代中國身份證 17位數字+一位檢驗碼
idlist = [
‘321105700101003’,
‘321105197001010030’,
‘11210020170101054X’
]
for id in idlist:
print(re.findall(‘\d{17}[xX\d]|\d{15}’,id)[0])
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/97431