Python 返回部分结果的正则表达式
正则表达式只返回部分结果 我有下面的正则表达式,它只返回部分结果 基本上,我试图找到两个连续的单词,后跟一个包含 至少1个大写和小写字母 至少1位 我能够匹配结果,但只得到前两个单词,而不是第三个单词作为结果。此外,长度条件似乎不符合规定,即8到32之间Python 返回部分结果的正则表达式,python,regex,Python,Regex,正则表达式只返回部分结果 我有下面的正则表达式,它只返回部分结果 基本上,我试图找到两个连续的单词,后跟一个包含 至少1个大写和小写字母 至少1位 我能够匹配结果,但只得到前两个单词,而不是第三个单词作为结果。此外,长度条件似乎不符合规定,即8到32之间 def findWordandCode(w1, w2, sentence): return re.search(r'\b{0}(?:\W+\w+){{0,1}}\W+{1}\s*(?=.*[\d])(?=.*[A-Z])(?=.*[a-z
def findWordandCode(w1, w2, sentence):
return re.search(r'\b{0}(?:\W+\w+){{0,1}}\W+{1}\s*(?=.*[\d])(?=.*[A-Z])(?=.*[a-z]){{8,32}}'.format(w1, w2), sentence)
比如说
findWordandCode('word1','word2','word1 word2, abcABC123! blah blah')
这只返回word1 word2
预期结果:
word1 word2 abcABC123代码>按以下方式定义函数:
def findWordandCode(w1, w2, sentence):
m = re.search(r'\b{0}\s{1},\s'
'(?=\S*\d)(?=\S*[A-Z])(?=\S*[a-z])\S{{8,32}}(?=[\s|$])'\
.format(w1, w2), sentence)
return m.group() if m else ''
让我们从正则表达式开始描述:
word1({0}
)和word2({1}
)之间应该有一个空格,
或者可能是一系列空格(\s+
)
word2后面必须有逗号和空格(,\s
)
然后,每个正向前瞻应该在开始时有\S*
属于*
。有了一个点,这样的前瞻可以进入下一个单词,但是你
实际上应该在当前单词内检查
在所有3个lookahead之后,对于数字、小写字母和大写字母,
应该有与第三个单词匹配的部分-介于8和32之间
非空间字符
最后,为了避免较长的文字,应该有另一种说法
空格或字符串结尾的正向前瞻
现在就整个功能而言:
从重新搜索开始,但请记住,如果没有匹配项,
结果是没有
然后,如果找到匹配项,则返回它(m.group()
)
如果不是,则返回空字符串(或选择另一个“失败”值,
e、 g.无)
模式(?=.[a-z]){8,32}
的最后一部分对小写字符重复正向前瞻断言8-32次
如果希望第三个单词的长度为8-32个非空白字符,可以使用\S{8,32}(?!\S)
在您的模式中,您实际上没有匹配第三个单词
在lookaheads中,您可以使用否定,通过添加空白字符来避免跨越边界
您可以使用:
\bword1(?:[ \t]+\S+)*\W+word2\b.*?\s+(?=[^\d\s]*\d)(?=[^A-Z\s]*[A-Z])(?=[^a-z\s]*[\sa-z])\S{8,32}(?!\S)
|
你的代码可能看起来像
import re
def findWordandCode(w1, w2, sentence):
return re.search(r'\b{0}(?:[ \t]+\S+)*\W+{1}\b.*?\s+(?=[^\d\s]*\d)(?=[^A-Z\s]*[A-Z])(?=[^a-z\s]*[\sa-z])\S{{8,32}}(?!\S)'.format(w1, w2), sentence)
res = findWordandCode('word1','word2','word1 word2, abcABC123! blah blah')
if res:
print(res.group())
结果
word1 word2, abcABC123!
尝试使用在线正则表达式调试器查看正则表达式如何解释字符串{0,1}
可以缩写为just?
。为什么希望abcABC123代码>要包含在结果中吗?它由“向前看”匹配,而“向后看”不包括在匹配中。