![](/img/trans.png)
[英]Python re.sub use non-greedy mode (.*?) with end of string ($) it comes greedy!
[英]How can I use regex to match sub-string start by words (not included) to the end of string, and keep non-greedy at same time?
我想找到一个以单词(\d月|\d日)
开头(不包括在结果中)到字符串结尾的子串,同时保持子串最短(非贪婪). 例如,
str1 = "秋天9月9日长江工程完成"
res1 = re.search(r'(\d月|\d日).*', str1).group() #return 9月9日长江工程完成
我想返回长江工程完成
这样的结果,再比如,
str2 ="秋天9月9日9日长江工程完成"
它应该得到与前一个相同的结果
因此我尝试了这几种方法,但都返回了意想不到的结果,请给我一些建议......
res1 = re.search(r'(?:(?!\d月|\d日))(?:\d月|\d日)', str1).group() #return 9月
res1 = re.search(r'(?:\d月|\d日)((?:(?!\d月|\d日).)*?)', content).group() #return 9月
如果要捕获字符串的 rest,请将.*
包围起来。
要捕获一个或多个相同的模式,您可以使用+
运算符。
import re
content = "9月9日9月长江工程完成"
match = re.match(r'(?:\d月|\d日)+(.*)', content)
print(match[1])
Output:
长江工程完成
(?:(??\d月|\d日))(::\d月|\d日)
此模式仅捕获初始单词,因为您没有将 rest 捕获为一个组。 (此外,它只允许恰好出现两次)。
(?:\d月|\d日)((?:(?.\d月|\d日)?)*?)
此模式只需要匹配如下所示的字符串: 9月4日a6日b0月x
- 可能不是您需要的
PS 确保您从re
: match
、 search
或fullmatch
中选择正确的 function(请参阅re.search 和 re.match 之间的区别是什么? )。 你说你需要整个字符串需要以给定的单词开头,所以match
或fullmatch
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.