1

我很难弄清楚为什么这段代码不产生匹配对象。我在 Centos 操作系统上运行 python 版本 2.6.6。

>>> x = r'\[GOOD\]'
>>> y = r'it made me feel \[GOOD\]'
>>> match = re.search(x, y)
>>> print match
None

我的预期输出将是一个匹配对象,例如:

>>> match = re.search ('hi', 'hilllaos')
>>> print match
<_sre.SRE_Match object at 0x3299ac0>

有什么解释吗?

4

4 回答 4

4
>>> x = r'\\\[GOOD\\\]'
>>> y = r'it made me feel \[GOOD\]'
>>> re.search(x, y)
<_sre.SRE_Match object at 0x8aa3d40>

\\\[first\转义第二个(中间)斜杠,最后一个斜杠转义[.

\[在正则表达式中使用您正在转义[字符类,因此它\与字符串中的实际不匹配y

于 2013-11-04T19:42:16.820 回答
2

你不是在寻找斜线:

>>> re.search(r'\[GOOD\]', 'it made me feel [GOOD]')
<_sre.SRE_Match object at 0x00000000026C5C60>
于 2013-11-04T19:41:42.140 回答
2
x = r'\[GOOD\]'
print(len(x))  # prints 8
print(x[0])  # prints a backslash

字符串中有反斜杠。

但是,该模式与反斜杠不匹配。在正则表达式中,反斜杠修饰它后面的内容;在此示例中,反斜杠禁用[.

所以你的正则表达式只匹配文字字符串[GOOD]。但是x由于反斜杠,您的不包含该字符串。

如果您希望您的目标字符串只包含[GOOD]然后删除反斜杠:

y = r'it made me feel [GOOD]'

如果您希望搜索字符串匹配目标字符串中的反斜杠,您必须修改您的模式。这会起作用:

x = r'..GOOD..'  # use dot to match anything

但要真正匹配正则表达式中的反斜杠,请使用双反斜杠。反斜杠是一个特殊字符,它会修改它后面的字符,因此要获得反斜杠,请将其加倍:

x = r'\\.GOOD.\\'  match actual backslashes; use dot to match square braces

因此,您使用\\匹配反斜杠以及\[左方括号和\]右方括号。把它们放在一起:

x = r'\\\[GOOD\]\\'

但是您在这里没有使用正则表达式的任何特殊功能。这只是一个匹配一个文字字符串的正则表达式。

顺便说一句,Python 的“原始字符串”特性在这里很方便。在普通字符串中,您需要将反斜杠加倍以获得单个反斜杠,就像在模式中您需要将反斜杠加倍以匹配反斜杠一样。因此,要使用普通字符串编写模式,您需要将反斜杠加倍:

x = '\\\\\\[GOOD\\]\\\\'  # note not a raw string

呸!

于 2013-11-04T19:59:19.377 回答
1

正则表达式编译器也解释反斜杠,因此您的模式 ( x)有效地变为{GOOD]. 这并没有出现在你的字符串中,所以不匹配。如果要匹配带有反斜杠后跟反斜杠后跟 的字符串{GOOD]则需要将模式中的反斜杠加倍转义特殊字符:

x = r'\\\[GOOD\\\]'

现在该模式将匹配y

于 2013-11-04T19:45:35.170 回答