Python正则表达式不';不匹配。(点)作为一个字符

Python正则表达式不';不匹配。(点)作为一个字符,python,regex,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'] 正如您所看到的,它将您匹配为一个三个字符的单词,但我希望表达式将“you.”和“.”作为一个四个字符的单词 我对“,”,“;”,“:”等也有同样的问题 我对

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

\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']
正如您所看到的,它将您匹配为一个三个字符的单词,但我希望表达式将“you.”和“.”作为一个四个字符的单词

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

我对正则表达式很陌生,但我想这是因为这些字符被当作单词边界处理

有没有办法做到这一点

提前感谢,

编辑 Thaks对@BrenBarn和@Kendall Frey的回答我设法找到了我想要的正则表达式:

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

(?如果您想确保单词的前面和后面都有空格(而不是像您的案例中出现的句点),那么请使用

如中所述:

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


因此,如果要将句点计为单词字符而不是单词边界,则不能使用
\b
来指示单词边界。必须使用自己的字符类。例如,可以使用类似于
\s[^\s]{3}的正则表达式\s
如果要匹配由空格包围的3个非空格字符。如果仍然希望边界为零宽度(即限制匹配但不包括在其中),可以使用lookaround,类似于
(?这将是我的方法。还可以匹配紧跟标点后的单词

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']

如果你告诉它必须正好匹配3个字符,它显然不会匹配4个字符。你想用什么规则来决定是否/何时匹配第四个字符?我不想匹配什么,我只想
你。
被视为4个字符的单词,所以它不匹配正则表达式。你想把哪些字符算作单词边界?只有空格和行尾。你能接受答案吗?还有,为什么你用
\Z
而不是
$
?我想他们在这种情况下也会做同样的事情,但是
$
更容易辨认。他在一篇评论中澄清说,他不想匹配标点符号;相反,他想把句点算成一个数字s是一个单词字符,因此它会阻止“单词”
与您匹配。
(因为它超过三个字符)@BrenBarn已更新。谢谢。您的示例仍然不起作用,因为
\w
将不匹配句点。谢谢各位!!我找到了解决方案!我不知道lookarounds。此正则表达式要求单词周围始终有空格,因此它与您的第一个和最后一个单词不匹配。
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']