4

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

\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)
4

3 回答 3

3

如果您想确保单词前后都有一个空格(而不是像您的情况那样发生的句点),请使用lookaround

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

如果您需要它来匹配标点符号作为单词的一部分(例如“in.”),那么\w就不够了,您可以使用\S(除了空格之外的任何东西)

(?<=\s)\S{3}(?=\s)
于 2013-05-02T19:24:51.697 回答
1

文档中所述

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

所以如果你想让句号算作一个单词字符而不是一个单词边界,你就不能用它\b来表示一个单词边界。您必须使用自己的角色类。例如,\s[^\s]{3}\s如果要匹配由空格包围的 3 个非空格字符,则可以使用正则表达式。如果您仍然希望边界为零宽度(即限制匹配但不包含在其中),您可以使用环视,例如(?<=\s)[^\s]{3}(?=\s).

于 2013-05-02T19:28:51.737 回答
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']
于 2013-05-02T20:53:22.057 回答