1

我试图获得一个正则表达式,它可以匹配行首或某个单词之后的单词。我试过了:

r"[\A|my_word](smth)"

但它失败了,因为在这种情况下它与 \A 不匹配。那有什么问题?

事实证明 \A 在[]内不起作用:

In [163]: type(re.search(r"\A123", "123"))
Out[163]: <type '_sre.SRE_Match'>

In [164]: type(re.search(r"[\A]123", "123"))
Out[164]: <type 'NoneType'>

但我不明白为什么。

我正在使用 Python 2.6.6

编辑:经过一些评论后,我意识到我与[\A|my_word]一起使用的示例很糟糕。实际的表达式是[\AV]来匹配字符串的开头或 V。我遇到的主要问题是我很好奇为什么[\A]不起作用。

4

4 回答 4

6

我对括号字符类中的反斜杠的理解似乎是错误的,但即便如此,这种情况[\A|my_word]等同于[A|my_word]并将尝试匹配A, |, m, y, _, w, o,rd之前的单个之一smth

这是一个应该做你想做的事情的正则表达式;\A不幸的是,由于长度不同,不能在 Python 中使用后my_word视,但可以使用非捕获组:(?:\A|abc)(smth).

(如果需要,您也可以使用^而不是\A,尽管在多行模式下使用可能会有所不同,因为在该模式下,^在每个新行的开头[或者更确切地说,在每个换行符之后]也会匹配。)

于 2013-08-09T12:19:23.853 回答
1

括号子句中的\字符失去了作为转义字符的特殊含义。

[ ]其中将视为两个字符:\A

[参考]

正则表达式参考:

单一 UNIX 规范

Python 2.6 - 重新模块

更新

括号表达式本身就是特殊情况,因此像\A(几乎是正则表达式的控制命令)这样的特殊序列不太可能在那里工作。有点不自然...

还有一件事

Python参考所述:

(括号)用于表示一组字符。

\A是特殊的序列:

仅匹配字符串的开头。

它显然不是任何系列的角色,我知道\nNEWLINE,但我从未听说过 STARTLINE(也许很漂亮)。

此外,对于逃避现实的人:]如果它正好在起始[左括号之后, 您甚至可以放入括号而不逃避它:

例如,模式 []] 将匹配 ']'。

于 2013-08-09T12:18:23.323 回答
1

[\A]匹配 a\或a 的单个字符A。这可能不是你想要的。

于 2013-08-09T12:19:01.733 回答
1

锚点与角色类

\A是一个匹配字符串中某个位置的锚点——在本例中是字符串中第一个字符之前的位置。其他锚点是:单词边界,:字符串/行的开头,:字符串/行的结尾,:正前瞻,:负前瞻等。锚不消耗字符,只匹配字符串中的位置。\b^$(?=...)(?!...)

[abc]是一个始终与一个字符完全匹配的字符类- 在这种情况下,要么ab要么c

因此,在字符类中放置一个锚是没有意义的。

于 2013-08-09T13:37:43.460 回答