正则表达式
正则表达式问号 ? 的用法
1. 最常用的就是放在元字符后面的,表示前面的元字符出现零次或一次,例如"a?"等价于"a{0,1}";
2. 另一种情况就是放在量词后面的,与“贪婪型匹配(尽可能多)”相对,表示尽可能少地匹配,
如对于字符串"ab(cd)(ef)",如果用“贪婪”的正则 "\(.*\)" 来匹配的话,中间的 ".*" 是贪婪的,它尽可能多地匹配,所以能匹配"(cd)(ef)",而加上问号之后:"\(.*?\)"就只能匹配到 "(cd)" 。
如对于字符串"abcdcdef", 如果用"贪婪"的正则 ".*cd" 来匹配的话,它尽可能多地匹配,所以能匹配"abcdcd",而加上问好之后:".*?cd" 就只能匹配到 "abcd" 。
3. 问号 ? 的用法还有很多,可以百度查查资料。
正则表达式括号
正则表达式括号是正则表达式中一个重要的特性,它可以帮助我们对文本进行更细致的匹配和替换操作。在本文中,我们将通过实例介绍正则表达式括号及其用法。
捕获组
捕获组是指用括号将某个子表达式包括起来形成的一个组。它的作用是让对应的子表达式匹配到的文本可以在后续操作中被引用。
e.g.
import re s = 'Hello, world!' pattern = r'(.*) (w.*)!' match = re.search(pattern, s) print(match.group(1)) # 输出:Hello, print(match.group(2)) # 输出:world
在上面的示例代码中,我们使用了两个括号将正则表达式分成了两个子表达式,它们分别匹配字符串中的 Hello,
和 world
。使用 group
方法可以获取捕获组匹配到的文本,其中 group(1)
对应第一个捕获组,group(2)
对应第二个捕获组。当然,如果你只关注其中一个捕获组,也可以只写一个括号。
捕获组还可以通过后向引用来进行替换操作。
e.g.
s = 'Hello, world!' pattern = r'(.*)(w.*)( !)' replaced = re.sub(pattern, r'\2\1\3', s) print(replaced) # 输出:world! Hello,
在上面的示例代码中,我们使用了三个括号将正则表达式分成三个子表达式,它们分别匹配字符串中的 Hello,
、world
和 !
。我们使用了类似于格式化字符串的方式将匹配到的文本以特定的顺序进行了替换,其中 \2
对应第二个捕获组,\1
对应第一个捕获组,\3
对应第三个子表达式。
资料
正则表达式生成器、在线测试网站:https://www.sojson.com/regex/
正则表达式知识点:https://geek-docs.com/regexp/regexp-tutorials/47_regular_expression_parentheses.html