-
import re
导入re模块\d是一个正则表达式,表示一位数字字符
\d{3}表示匹配该模式3次==\d\d\d
向
re.compile()
传入一个字符串值,表示正则表达式,它将返回一个 Regex 模式对象search()
方法查找传入的字符串,寻找该正则表达式的所有匹配。若没匹配到,返回None;匹配到了,返回Match对象。 -
Match 对象有一个
group()
方法,它返回被查找字符串中实际匹配的文本import re phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d') # r'\d\d\d-\d\d\d-\d\d\d\d' is 原始字符串 mo = phoneNumRegex.search('My number is 415-555-4242.') print('Phone number found: ' + mo.group()) # Phone number found: 415-555-4242
-
利用括号分组,可以使用 group()匹配对象方法,从一个分组中获取匹配的文本
group()可以传递参数:默认是0或不传参数,返回匹配的整个文本
groups()
可以获得所有分组,返回多个值的元组phoneNumRegex = re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d\d)') mo = phoneNumRegex.search('My number is 415-555-4242.') print(mo.group(1)) # 415 print(mo.groups()) # ('415', '555-4242')
-
正则表达式匹配括号
(
或)
,使用[ ]
imgfile = re.compile(r'.*?([(])(\d*)([)])') mo = imgfile.search('img(32)') mo.groups() # ('(', '32', ')')
-
用管道
|
匹配多个分组 匹配多个表达式中的一个 ≈or若字符串里有多个匹配成功,第一个出现的文本,会作为Match对象返回
若匹配的多个字符前缀相同,可以使用括号
eg:‘Batman’、‘Batmobile’、‘Batcopter’和’Batbat’可以写成 re.compile(r’Bat(man|mobile|copter|bat)’) -
问号
?
匹配零次或一次 (\d)? 表示匹配单个数字零次或一次 -
星号
*
匹配零次或多次 -
加号
+
匹配一次或多次 -
花括号
{}
匹配指定次数
(hi){2}表示匹配字符串’hihi’
(hi){2,5}表示匹配的字符串里的hi可以是2~5个hi
r’(hi){3,5}’ 默认匹配最长的’hihihihihi’ (贪心匹配)
r’(hi){3,5}?'加一个问号匹配最短的’hihihi (非贪心匹配) -
findall()
方法,可以匹配所有符合的文本 返回一个字符串列表或返回一个字符串的元组的列表>>> phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d') # 没有分组 >>> phoneNumRegex.findall('Cell: 415-555-9999 Work: 212-555-0000') ['415-555-9999', '212-555-0000']
>>> phoneNumRegex = re.compile(r'(\d\d\d)-(\d\d\d)-(\d\d\d\d)') # 有分组 >>> phoneNumRegex.findall('Cell: 415-555-9999 Work: 212-555-0000') [('415', '555', '1122'), ('212', '555', '0000')]
-
缩写字符分类 表示 \d 0 到 9 的任何数字 \D 除 0 到 9 的数字以外的任何字符 \w 任何字母、数字或下划线字符(可以认为是匹配“单词”字符) \W 除字母、数字和下划线以外的任何字符 \s 空格、制表符或换行符(可以认为是匹配“空白”字符) \S 除空格、制表符和换行符以外的任何字符 . 通配字符.匹配除了换行之外的所有字符 .* 匹配所有字符 .*? 非贪心模式
.* 贪心模式 -
re.compile(‘.*’,
re.DOTALL
)
通过传入 re.DOTALL 作为 re.compile()的第二个参数,可以让句点字符匹配所有字符,包括换行字符。 -
re.IGNORECASE
或re.I
忽略匹配的大小写 -
建立自己的字符分类
用方括号定义自己的字符分类
用短横表示字母或数字的范围
在字符分类的左方括号后加上一个插入字符(^),就可以得到“非字符类”
re.compile(r’[^a-zA-Z0-9]') # 将匹配所有小写字母、大写字母、数字和非字符类(.?*等) -
插入字符
^
和美元字符$
必须使用正则表达式
^以xxx开头 $以xxx结尾>>> wholeStringIsNum = re.compile(r'^\d+$') >>> wholeStringIsNum.search('1234567890') <_sre.SRE_Match object; span=(0, 10), match='1234567890'> >>> wholeStringIsNum.search('12 34567890') == None True
-
sub()
方法替换字符串>>> namesRegex = re.compile(r'Agent \w+') # \w+ 任意子母、数字或下划线匹配多次 >>> namesRegex.sub('CENSORED', 'Agent Alice gave the secret documents to Agent Bob.') 'CENSORED gave the secret documents to CENSORED.'
>>> agentNamesRegex = re.compile(r'Agent (\w)\w*') # (\w)分组 >>> agentNamesRegex.sub(r'\1****', 'Agent Alice told Agent Carol that Agent Eve knew Agent Bob was a double agent.') A**** told C**** that E**** knew B**** was a double agent.'
-
较复杂的正则表达式
re.VERBOSE
忽略正则表达式字符串中的空白符和注释phoneRegex = re.compile(r'((\d{3}|\(\d{3}\))?(\s|-|\.)?\d{3}(\s|-|\.)\d{4} (\s*(ext|x|ext.)\s*\d{2,5})?)')
可以写成下面的代码,清晰易懂
phoneRegex = re.compile(r'''( (\d{3}|\(\d{3}\))? # area code (\s|-|\.)? # separator \d{3} # first 3 digits (\s|-|\.) # separator \d{4} # last 4 digits (\s*(ext|x|ext.)\s*\d{2,5})? # extension )''', re.VERBOSE)
-
第二个参数只能传一个,若想传入多个可以使用|按位符
re.compile(‘foo’, re.IGNORECASE | re.DOTALL | re.VERBOSE)
Regex Tester - Javascript, PCRE, PHP
Test your Javascript and PCRE regular expressions online
在线测试Javascript和PCRE正则表达式