正则表达式匹配特例

时间:2017-12-12 10:29:24

标签: python regex

我有一个带有这样一串字符串的电影场景:

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不匹配,但也与没有数字的字符串不匹配...我无法得到正确的模式,任何人都可以请我带领我在正确的方向?感谢。

4 个答案:

答案 0 :(得分:1)

您可以使用否定前瞻:

80101_\d*(?!intertitle)

如果其内容出现在使用点,那么否定前瞻(?! ... )会阻止匹配。

regex101 demo

您的模式可以写成:

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)