python -- 正则表达式
简单匹配邮箱地址
匹配 huangkwell@163.com
正则表达式: [a-zA-Z]+@[1-9]{3}.com 或者 \w+@\d+.(com|cn)
概念
正则表达式(简称regex)是一些由字符和特殊符号组成的字符串,它们描述了模式的重复或者表述多个字符,于是正则表达式能按照某种模式匹配一系列有相似特征的字符串,简而言之,正则表达式能够匹配多个字符串。
常见正则表达式符号
表示法 | 描述 | 正则表达式示例 |
---|---|---|
literal | 匹配文本字符串字面值literal | foo |
rel1|rel2 | 匹配正则表达式rel1或rel2 | foo|bar |
. | 匹配任何字符 | b.b |
^ | 匹配字符串起始部分 | ^abc |
$ | 匹配字符串终止部分 | abc$ |
* | 匹配0次或多次前面的正则表达式 | [A-Z]* |
+ | 匹配1次或多次前面的正则表达式 | [A-Z]+ |
? | 匹配0次或1次前面的正则表达式 | [A-Z]? |
匹配N次前面的正则表达式 | [A-Z] | |
匹配M~N次前面的正则表达式 | [A-Z] | |
[...] | 匹配中括号中的任意单一字符 | [akdf] |
[x-y] | 匹配x~y范围中的任意单一字符 | [0-9],[A-Za-z] |
[^...] | 不匹配此字符集中出现的任何一个字符 | [aeiou],[A-Za-z0-9] |
(...) | 匹配封装的正则表达式,然后另存为子组 | ([0-9]{3})? |
\d | 匹配任何十进制数字,与[0-9]一致(\d则相反,不匹配任何数字) | data\d+.txt |
\w | 匹配任何字母数字字符,与[A-Za-z0-9]相同 | [A-Za-z]\w+ |
\s | 匹配任何空格 | of\sthe |
\b | 匹配任何单词边界 | \bTHE\b |
\N | 匹配已保存的子组N | price:\16 |
\c | 逐字匹配任何特殊字符c | \.,\* |
?P |
像一个仅由name标识而不是数字ID的正则分组匹配 | (?P) |
使用择一匹配符号匹配多个正则表达式模式
表示择一匹配的管道符号|,表示一个“从多个模式中选择其一”的操作
正则表达式模式 | 匹配的字符串 |
---|---|
at | home | at、home |
r2d2 | c3po | r2d2,c3po |
使用圆括号指定分组
不仅需要知道整个字符串是否匹配,而也要知道特定子部分是否匹配
正则表达式模式 | 匹配的字符串 |
---|---|
\d+(.\d*)? | 匹配简单浮点数 |
re模块:
findall()
1 findall() 所有结果都返回到一个列表里
r2 = re.findall('asd', 'asdljdfasd')
print(r2)
返回结果:['asd', 'asd']
search(),需要使用group()
2 search()返回匹配到的一个对象,对象可以调用group()返回结果
r2 = re.search('asd', 'aljdfasd')
print(r2)
print(r2.group())
返回结果:
asd
match(),,需要使用group()
3 match()只在字符串开始匹配
r1 = re.match('asd','asdljdfasd')
print(r1)
print(r1.group())
返回结果:
asd
split()
4 sp = re.split(':',"str1:str2:str3")
print(sp)
返回结果:['str1', 'str2', 'str3']
贪婪匹配与非贪婪匹配
patt = '.+(\d+-\d+-\d+).+'
data = 'haungke 2017-08-26 kwell'
s = re.search(patt,data)
print(s.group())
# haungke 2017-08-26 kwell
print(s.group(1))
# 7-08-26
第二个输出期望是2017-08-26,但结果却不对,因为正则表达式默认是贪心的,也就是说,如果正则表达式使用通配符,那它会尽量抓取满足匹配的最长字段,正则表达式中的".+"抓取了"huangke 201"
解决方法:使用非贪婪操作符"?"
它的作用是要求正则表达式引擎匹配的字符越少越好。
patt = '.+?(\d+-\d+-\d+).+'
data = 'haungke 2017-08-26 kwell'
s = re.search(patt,data)
print(s.group())
# haungke 2017-08-26 kwell
print(s.group(1))
# 2017-08-26