我正在尝试将字符串与正则表达式匹配,并且只有两个案例中的一个正在工作
字符串
ABCD 123 - Abcdef 0000
ABCD 123/DEFG123 - Abcdef 0000
正则表达式
[A-Z]+ [A-Z0-9]{2,20} - [A-Z][a-z]+ [0-9]{4}
这匹配第一个,我试图将它与两者匹配,这是我尝试的新表达
[A-Z]+ [A-Z0-9\\/]{2,20} - [A-Z][a-z]+ [0-9]{4}
这与整个DEFG123 - Abcdef 0000
中的ABCD 123/DEFG123 - Abcdef 0000
匹配,但我试图从中获取整个字符串。这是我正在使用的代码
regex = re.compile(expression)
r = regex.search(string)
答案 0 :(得分:0)
我很确定你不需要逃避正斜杠。删除双\
,您应该设置。使用regexpal.com来测试这种事情。
答案 1 :(得分:0)
删除额外的反斜杠:
[A-Z]+ [A-Z0-9\/]{2,20} - [A-Z][a-z]+ [0-9]{4}
或者您可以使用分组:
([A-Z]+ [A-Z0-9]{2,20} - [A-Z][a-z]+ [0-9]{4})|([A-Z]+ [A-Z0-9\\/]{2,20} - [A-Z][a-z]+ [0-9]{4})
这结合了上面的两个RegExes并匹配两行。
答案 2 :(得分:0)
我试过这段代码:
import re
def foo(s):
r = re.compile('[A-Z]+ [A-Z0-9\\/]{2,20} - [A-Z][a-z]+ [0-9]{4}')
m = r.search(s)
return s[m.start():m.end()]
print foo('ABCD 123 - Abcdef 0000')
print foo('ABCD 123/DEFG123 - Abcdef 0000')
并得到以下结果:
ABCD 123 - Abcdef 0000
ABCD 123/DEFG123 - Abcdef 0000
尝试使用^
(行首)和$
(行尾)字符:
r = re.compile('^[A-Z]+ [A-Z0-9\\/]{2,20} - [A-Z][a-z]+ [0-9]{4}$')
答案 3 :(得分:0)
逃避是错的。拿出来:
string_one = 'ABCD 123 - Abcdef 0000'
string_two = 'ABCD 123/DEFG123 - Abcdef 0000'
pattern = r'[A-Z]+ [A-Z0-9/]{2,20} - [A-Z][a-z]+ [0-9]{4}'
regex = re.compile(pattern)
if regex.search(string_one):
print "string one matches!"
if regex.search(string_two):
print "string two matches!"
# output:
string one matches!
string two matches!
请注意,我对原始字符串(r'this is a raw string'
)的使用是不必要的,但我痴迷地使用原始字符串作为模式,因为它们可以防止大多数反斜杠插值。