我有一个带有这样一串字符串的电影场景:
80101_intertitle:Blablabla
80101_1:BlablablaBlablabla
80101_2:Blablabla
80101_:BlablablaBlablablaBlablabla
80101_3:BlablablaBlablabla
80101_11:Blablabla
801_1:Blablabla
801_2:Blablabla
我的目标是在所选序列中匹配所有数字:
(在此示例中选择为80101_
,字符串#2,#3,#5,#6),匹配字符串没有现有数字(如80101_:Blablab
,字符串#4)但没有将字符串与_intertitle
匹配(字符串#1)。
我现在的正则表达式看起来像这样(Python中的代码):
selection = "80101"; # I'm getting this from elsewhere
pattern = selection + "_" + "\d*";
这匹配所有带/不带数字的字符串,但也匹配_intertitle
的字符串。如果我修改我的模式"\d[^:]*"
,它与_intertitle
不匹配,但也与没有数字的字符串不匹配...我无法得到正确的模式,任何人都可以请我带领我在正确的方向?感谢。
答案 0 :(得分:1)
您可以使用否定前瞻:
80101_\d*(?!intertitle)
如果其内容出现在使用点,那么否定前瞻(?! ... )
会阻止匹配。
您的模式可以写成:
pattern = selection + r"_\d*(?!intertitle)"
答案 1 :(得分:1)
我认为你应该添加"(?= :)和#34;在你的模式中:
r"80101_\d*(?=:)"
这意味着:选择" 80101 _" +仅当其后跟"时才为零或更多位数:"。如果是" 80101_intertitle:Blablabla"我们在" 80101 _"之间有一个非数字符号。和":",所以它不匹配。
答案 2 :(得分:0)
你需要锚点和多线标志。此外,您还应在正则表达式的末尾添加:.*
以匹配整个字符串。
^80101_\d*:.*$
参见演示:https://regex101.com/r/yqGgrv/1
以下是相应的python代码:
In [1]: s = """80101_intertitle:Blablabla
...: 80101_1:BlablablaBlablabla
...: 80101_2:Blablabla
...: 80101_:BlablablaBlablablaBlablabla
...: 80101_3:BlablablaBlablabla
...: 80101_11:Blablabla
...: 801_1:Blablabla
...: 801_2:Blablabla"""
In [2]: import re
In [4]: re.findall(r'^80101_\d*:.*$', s, re.M)
Out[4]:
['80101_1:BlablablaBlablabla',
'80101_2:Blablabla',
'80101_:BlablablaBlablablaBlablabla',
'80101_3:BlablablaBlablabla',
'80101_11:Blablabla']
答案 3 :(得分:0)
是的,这很容易做到:
import re
s = '''80101_intertitle:Blablabla
80101_1:BlablablaBlablabla
80101_2:Blablabla
80101_:BlablablaBlablablaBlablabla
80101_3:BlablablaBlablabla
80101_11:Blablabla
801_1:Blablabla
801_2:Blablabla'''
matches = re.findall(r'(80101_\d+:.*)', s)
for match in matches:
print(match)
matches = re.findall(r'(80101_:.*)', s)
for match in matches:
print(match)