我有一个匹配字符串中所有三个字符的正则表达式:
\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)
答案 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']