跳至主要內容

Python

LincZero大约 3 分钟

Python

目录

re 字符串正则匹配

字符串方法

只需简单的操作时,字符串方法最好用,因为它们易读,又容易调试:

>>> 'tea for too'.replace('too', 'two')
'tea for two'

re 基本使用

reopen in new window 模块为高级字符串处理提供了正则表达式工具。对于复杂的匹配和处理,正则表达式提供了简洁、优化的解决方案:

findall、sub

>>> import re
>>> re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest')  # 匹配
['foot', 'fell', 'fastest']

>>> re.sub(r'(\b[a-z]+) \1', r'\1', 'cat in the the hat')  # 替换。注意sub()方法替换字符串的时候如果不匹配,就会返回原字符串。很容易出错
'cat in the hat'

其他

详见文档

re.search(pattern, string, flags=0)
# 扫描整个 字符串 找到匹配样式的第一个位置,并返回一个相应的 匹配对象。如果没有匹配,就返回一个 None ; 注意这和找到一个零长度匹配是不同的。

re.match(pattern, string, flags=0)
# 如果 string 开始的0或者多个字符匹配到了正则表达式样式,就返回一个相应的 匹配对象 。 如果没有匹配,就返回 None ;注意它跟零长度匹配是不同的。

re.sub(pattern, repl, string, count=0, flags=0)
# 返回通过使用 repl 替换在 string 最左边非重叠出现的 pattern 而获得的字符串。 如果样式没有找到,则不加改变地返回 string。 repl 可以是字符串或函数;如为字符串,则其中任何反斜杠转义序列都会被处理。 也就是说,\n 会被转换为一个换行符,\r 会被转换为一个回车符,依此类推。 未知的 ASCII 字符转义序列保留在未来使用,会被当作错误来处理。 其他未知转义序列例如 \& 会保持原样。 向后引用像是 \6 会用样式中第 6 组所匹配到的子字符串来替换。

rearch和match的区别

# match()和search()都只匹配一个结果,但是match()是从字符串的开头开始匹配的,如果匹配的字符不是在开头处,那么它将会报错,匹配成功返回结果,没有返回None。而search()是从头开始匹配,匹配整一个字符串得出结果
import re
result1 = re.match('li', 'liadadafbba').group()
result2 = re.match('li', 'addadlidadaf')
print(result1, result2)  # li None

import re
# result1 = re.match('li', 'liadadafbba')
result2 = re.match('li', 'addadlidadaf').group()
print(result2)  # 报错

import re
result1 = re.search('li', 'liadadafbba').group()
result2 = re.search('li', 'addadlidadaf').group()
print(result1, result2)  # li li

取子串(坑点)

坑的地方在于:序列0是完整匹配(默认是0),序列1才是第一个,非常反直觉......

>>> m = re.match(r"(\w+) (\w+)", "Isaac Newton, physicist")
>>> m.group(0)       # The entire match
'Isaac Newton'
>>> m.group(1)       # The first parenthesized subgroup.
'Isaac'
>>> m.group(2)       # The second parenthesized subgroup.
'Newton'
>>> m.group(1, 2)    # Multiple arguments give us a tuple.
('Isaac', 'Newton')

不过话说其他程序中的正则也是,例如QT C++的 <QRegularExpression> 模块

QRegularExpression re(R"(^OnGetWebViewPageFinish:(.+?/log)$)");
QString line = in.readLine();
QRegularExpressionMatch match = re.match(line);
if(match.hasMatch())
{
    qDebug()<<"WishUrl1: "<<match.captured(1);	// 序列1才是第一个匹配项
    return match.captured(1);
}

实战 - 匹配并替换内容

import re
pattern = r"元"	 # 模式字符串
str1 = "75元、89元"  # 匹配字符串
replace = re.sub(pattern, "美元", str1)
print(str1)	 # "75美元、89美元"