我有两个字符串PG((0,0), (0,1), (1,1), (1,0))
和P(1,1)
我需要编写能够在正则表达式的帮助下识别这些字符串的代码。
到目前为止,我有这个:
if(re.search("^[P\(]",line) is not None):
print "P found"
这标识了两个字符串,但只应标识P(1,1)
if(re.search("^[PG\(\(]",line) is not None):
print "PG found"
这也标识了两个字符串,但只应标识PG((0,0), (0,1), (1,1), (1,0))
我在这里做错了什么?
答案 0 :(得分:3)
你的正则表达式正在使用字符类([]
内的东西)。这意味着“匹配任何这些字符”。所以,你是第一个匹配任何以“P”或“(”开头的字符串,你的第二个匹配任何以“P”,“G”或“(”开头的字符串。最简单的解决方法是删除字符class - 例如:
re.search(r"^PG\(\(",line)
请注意,我使用了“原始字符串”(前缀为r
的字符串)。这可以防止python执行它通常的字符转义。另请注意,如果您从使用re.search
更改为re.match
,则可以摆脱行锚点的开头:
re.match(r"PG\(\(",line)
因为re.match
仅从字符串的开头起作用。它简化了正则表达式,在处理正则表达式时,我觉得每一种可能的简化都是值得的。在那个注释中,你可以甚至放弃这里的正则表达式,只需使用str.startswith
:
if line.startswith('PG(('):
...
elif line.startswith('P('):
...
答案 1 :(得分:0)
删除方括号,因为它们标记字符集。使用:
if(re.search(r"^P\(",line) is not None):
之前版本与两个表达式匹配的原因是它会测试P
或 \(
,并且都包含一个左括号。