使用正则表达式搜索时区分相似字符串的问题

时间:2013-05-16 22:20:21

标签: python regex

我有两个字符串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))

我在这里做错了什么?

2 个答案:

答案 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 \(,并且都包含一个左括号。