Python正则表达式非贪婪不匹配
我有这篇课文Python正则表达式非贪婪不匹配,python,regex,Python,Regex,我有这篇课文 This is test 2019 -(dsd) g1-d2 720p test This test 2019 - g1-d2 test 它们是分开的线,所以不在一起 我试图抓住2019年和720便士之间的所有东西,如果有的话 (.+?) ([0-9]{4})(.+?)([0-9]{3,4}p)?(.*) 问题是组(+?)只匹配单个字符。我想比赛到720便士。如果使用非贪婪,那么它匹配所有内容 我想要的输出是 G1: This is test G2: 2019 G3: -(d
This is test 2019 -(dsd) g1-d2 720p test
This test 2019 - g1-d2 test
它们是分开的线,所以不在一起
我试图抓住2019年和720便士之间的所有东西,如果有的话
(.+?) ([0-9]{4})(.+?)([0-9]{3,4}p)?(.*)
问题是组(+?)只匹配单个字符。我想比赛到720便士。如果使用非贪婪,那么它匹配所有内容
我想要的输出是
G1: This is test
G2: 2019
G3: -(dsd) g1-d2
G4: 720p
G5: test
你只需要摆弄一下你的后顾之忧和前顾之忧
(?<=2019)(.+?)(?=720p)
(?您需要删除([0-9]{3,4}p)
之后的?
量词,因为它将使前一组成为可选组,并且不会强制引擎匹配它
编辑
要匹配带或不带720p
的字符串,可以将(.+?)
和([0-9]{3,4}p)
包含到可选的非捕获组(?:)?
像这样:
(.+?)([0-9]{4})(?:(.+?)([0-9]{3,4}p))?(.*)
我们可以尝试在以下模式上执行正则表达式拆分:
(?=\d{4})|(?<=\d{4}) | (?=\d{3,4}p)|(?<=\d{3}p) |(?<=\d{4}p)
这里的想法是使用lookarounds进行拆分,lookarounds断言,但实际上不消耗输入中的任何内容。每当我们向前看或向后看时,看到一个4位数的年份,或一个3-4位数的数字,后跟p
2019和720p不是固定的,可以像任何年份一样变化,分辨率也可以像1080p2160p@rgd你总是可以替换其他正则表达式模式。请参见编辑。具有720p的组是可选的,因此它不会始终存在,但该部分可能存在,也可能不存在,因此它不会始终存在。确定我以为您只希望在存在720p的情况下匹配字符串。请参见编辑,现在应按预期工作。谢谢,您的解决方案非常有效,而且非常简单:)靠近我的,我想你想在720便士或绳子的末端之前抓住一切。所以不是“不确定”?使用(([0-9]{3,4}p)(.*))|$
(?=\d{4})|(?<=\d{4}) | (?=\d{3,4}p)|(?<=\d{3}p) |(?<=\d{4}p)
input = "This is test 2019 -(dsd) g1-d2 720p test"
parts = re.split(r' (?=\d{4})|(?<=\d{4}) | (?=\d{3,4}p)|(?<=\d{3}p) |(?<=\d{4}p) ', input)
print(parts)
['This is test', '2019', '-(dsd) g1-d2', '720p', 'test']