0

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

我在这里做错了什么?

4

2 回答 2

3

您的正则表达式正在使用字符类(里面的东西[])。这意味着,“匹配任何这些字符”。因此,您的第一个匹配任何以“P”或“(”开头的字符串,而您的第二个匹配任何以“P”,“G”或“(”开头的字符串。最简单的解决方法是删除字符类——例如:

re.search(r"^PG\(\(",line)

请注意,我使用了“原始字符串”(以 为前缀的字符串r)。这可以防止 python 进行通常的字符转义。另请注意,如果您从 using 更改re.searchre.match,则可以摆脱行锚的开头:

re.match(r"PG\(\(",line)

asre.match仅适用于从字符串的开头开始。它稍微简化了正则表达式,在处理正则表达式时,我觉得所有可能的简化都是值得的。在那张纸条上,您甚至可以在这里完全放弃正则表达式,只需使用str.startswith

if line.startswith('PG(('):
   ...
elif line.startswith('P('):
   ...
于 2013-05-16T22:24:49.867 回答
0

删除方括号,因为它们标记字符集。采用:

if(re.search(r"^P\(",line) is not None):

以前的版本匹配这两个表达式的原因是它会测试P or \(,并且都包含一个左括号。

于 2013-05-16T22:24:07.240 回答