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