Regex返回部分resu

2024-06-25 23:39:40 发布

您现在位置:Python中文网/ 问答频道 /正文

正则表达式只返回部分结果

下面的正则表达式只返回部分结果 基本上,我试图找到两个连续的词后面的一个词,其中包含 至少1个大写和小写字母 至少1位

我能够匹配结果,但只得到前2个单词,而不是第3个单词作为结果。似乎长度条件也没有按规定工作,即在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]){{8,32}}'.format(w1, w2), sentence)

例如。你知道吗

findWordandCode('word1','word2','word1 word2, abcABC123! blah blah')

这只返回word1 word2

预期结果:word1 word2 abcABC123!


Tags: rereturndef条件单词sentencew1blah
2条回答

模式的最后一部分(?=.*[a-z]){8,32}对小写字符重复肯定的前瞻断言8-32次。你知道吗

如果希望第三个单词的长度为8-32个非空白字符长,可以使用\S{8,32}(?!\S)

在您的模式中,您实际上没有匹配第三个单词。你知道吗

在lookaheads中,您可以使用否定,利用negated character class添加一个空白字符来不跨越边界。你知道吗

您可以使用:

\bword1(?:[ \t]+\S+)*\W+word2\b.*?\s+(?=[^\d\s]*\d)(?=[^A-Z\s]*[A-Z])(?=[^a-z\s]*[\sa-z])\S{8,32}(?!\S)

Regex demo| Python demo

你的代码可能看起来像

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!

按以下方式定义函数:

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

让我们从正则表达式开始描述:

  1. word1{0})和word2{1})之间应该有一个空格, 或者是一个空格序列(\s+)。你知道吗
  2. 单词2后面必须有逗号和空格(,\s)。你知道吗
  3. 那么每个正向前瞻应该在开头有\S*.*。有了一个圆点,这样的展望可以进入下一个词,但你 实际上应该在当前单词内检查。你知道吗
  4. 在所有3个查找头之后,对于数字、小写字母和大写字母, 第三个单词应该有匹配的部分-在8到32之间 非空间字符。你知道吗
  5. 最后,为了避免较长的单词,应该有另一个 对空格或字符串结尾的正向展望。你知道吗

现在就整个功能而言:

  1. 开始检索,但请记住,如果没有匹配, 结果是。你知道吗
  2. 然后,如果找到匹配项,则返回它(m.group())。你知道吗
  3. 如果不是,则返回空字符串(或选择另一个“failed”值, e、 g.)。你知道吗

相关问题 更多 >