Python Regex不匹配。 (点)作为一个角色

时间:2013-05-02 19:15:10

标签: python regex

我有一个匹配字符串中所有三个字符的正则表达式:

\b[^\s]{3}\b

当我将它与字符串一起使用时:

And the tiger attacked you.

这是结果:

regex = re.compile("\b[^\s]{3}\b")
regex.findall(string)
[u'And', u'the', u'you']

正如你所看到的那样,它与三个字符的单词相匹配,但我希望表达式采用“你”。用“。”作为4个字符。

我对“,”,“;”,“:”等有同样的问题。

我对正则表达式很新,但我想这是因为这些字符被视为字边界。

有没有办法做到这一点?

提前致谢,

修改

想知道@BrenBarn和@Kendall Frey的答案我设法得到了我正在寻找的正则表达式:

(?<!\w)[^\s]{3}(?=$|\s)

3 个答案:

答案 0 :(得分:3)

如果你想确保单词前面跟着一个空格(而不是像你的情况那样的句号),那么使用lookaround

(?<=\s)\w{3}(?=\s)

如果您需要将标点符号作为单词的一部分(例如“in。”)进行匹配,那么\w就不够了,您可以使用\S(除了空格之外的其他任何内容)< / p>

(?<=\s)\S{3}(?=\s)

答案 1 :(得分:1)

the documentation中所述:

  

单词被定义为字母数字或下划线字符的序列,因此单词的结尾由空格或非字母数字的非下划线字符表示。

因此,如果您希望将句点计为单词字符而不是单词边界,则不能使用\b来指示单词边界。你必须使用自己的角色类。例如,如果要匹配由空格包围的3个非空格字符,则可以使用\s[^\s]{3}\s等正则表达式。如果您仍然希望边界为零宽度(即限制匹配但不包含在其中),则可以使用环绕声,例如(?<=\s)[^\s]{3}(?=\s)

答案 2 :(得分:1)

这将是我的方法。也匹配标点符号后面的单词。

import re

r = r'''
        \b                   # word boundary
        (                    # capturing parentheses
            [^\s]{3}         # anything but whitespace 3 times
            \b               # word boundary
            (?=[^\.,;:]|$)   # dont allow . or , or ; or : after word boundary but allow end of string
        |                    # OR
            [^\s]{2}         # anything but whitespace 2 times
            [\.,;:]          # a . or , or ; or :
        )
    '''
s = 'And the tiger attacked you. on,bla tw; th: fo.tes'

print re.findall(r, s, re.X)

输出:

['And', 'the', 'on,', 'bla', 'tw;', 'th:', 'fo.', 'tes']