我目前正在尝试使用正则表达式匹配墨西哥1 - 2喀麦隆之类的短语,在使用正则表达式测试正则表达式时匹配,但在使用re的Python中没有匹配。
我的正则表达式是:
regex = '(mexico[\s]*\d[\s]*[-][\s]*\d[\s]*cameroon)|(mexico[\s]*\d[\s]*cameroon[\s]\d)|(mexico[\s]*\d[\s]*[-][\s]*cameroon[\s]*\d)|(cameroon[\s]*\d[\s]*[-][\s]*\d[\s]*mexico)|(cameroon[\s]*\d[\s]*mexico[\s]\d)|(cameroon[\s]*\d[\s]*[-][\s]*mexico[\s]*\d)'
和我的测试短语:
testphrase = RT @remitouja: @TheJUMPsociety cameroon 1 - 1 mexico #winecup #WorldCup"
我在regexpal中成功匹配但不是python,但是testphrase并没有。但两者中的以下匹配:
cameroon 1 - 1 mexico #winecup #WorldCup
使用
if re.match(regex, testtweet) is not None:
print "Is true"
测试
答案 0 :(得分:4)
您需要使用re.search
。
您不匹配,因为默认情况下re.match
会将您的正则表达式固定在字符串的开头,就好像您的正则表达式是^(mexico....
(等):
if re.search(regex, testtweet) is not None:
print "Is true"
其次,生成你的python正则表达式字符串是一个好习惯我把r
放在前面:
regex = r'(mexico[\s]*\d[\s]*[-][\s]*\d[\s]*cameroon)|(mexico[\s]*\d[\s]*cameroon[\s]\d)|(mexico[\s]*\d[\s]*[-][\s]*cameroon[\s]*\d)|(cameroon[\s]*\d[\s]*[-][\s]*\d[\s]*mexico)|(cameroon[\s]*\d[\s]*mexico[\s]\d)|(cameroon[\s]*\d[\s]*[-][\s]*mexico[\s]*\d)'
接下来,您不需要将-
放在方括号或任何其他字符之间(如果它是单独的)。有许多团体可能是少数,所以我相信删除捕获组应该足够了:
regex = r'mexico\s*\d\s*-\s*\d\s*cameroon|mexico\s*\d\s*cameroon\s*\d|mexico\s*\d\s*-\s*cameroon\s*\d|cameroon\s*\d\s*-\s*\d\s*mexico|cameroon\s*\d\s*mexico\s\d|cameroon\s*\d\s*-\s*mexico\s*\d'