2013-05-02 23 views
4

我有一个匹配字符串中的所有三个字符单词的正则表达式:Python正则表达式不匹配。 (点)作为字符

\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字的词。

我有同样的问题“”,‘’,‘’等

我用正则表达式相当新的,但我想这是因为这些字符,如文字处理边界。

是否有这样做的一种方式?

由于提前,

编辑

Thaks到@BrenBarn和@Kendall弗雷我的答案,设法以正则表达式我一直在寻找:

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

这很明显,如果你告诉它,它必须准确3个字符匹配不匹配4个字符的任何东西。你想用什么规则来决定是否/何时匹配第四个字符? – BrenBarn 2013-05-02 19:18:06

+1

我不希望它匹配,我只是想将'you.'视为4个字符的单词,因此它与正则表达式不匹配 – xgusix 2013-05-02 19:23:48

+0

您希望将哪些字符计为字边界? – BrenBarn 2013-05-02 19:24:46

回答

3

如果你想以确保该单词前后有一个空格(而不是像你的情况那样发生),然后使用lookaround

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

如果你需要它来搭配标点符号作为单词的一部分(如“专业”。)然后\w将是不够的,你可以使用\S(任何东西,但有一个空格)

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

他在评论中澄清说,他不想匹配标点符号;相反,他希望这段时间被视为一个单词字符,因此它可以防止匹配的“单词”“你”(因为它超过三个字符)。 – BrenBarn 2013-05-02 19:32:33

+0

@BrenBarn更新。谢谢。 – 2013-05-02 19:40:10

+0

您的示例仍然无法使用,因为\ w不会与句点匹配。 – BrenBarn 2013-05-02 19:49:22

1

the documentation描述:

一个字被定义为字母数字序列或下划线字符,所以一个字的结束由空格或一个非字母数字表示,正在下划线字符。

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

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