Python 返回部分结果的正则表达式

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

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

我有下面的正则表达式,它只返回部分结果 基本上,我试图找到两个连续的单词,后跟一个包含 至少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]){{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要包含在结果中吗?它由“向前看”匹配,而“向后看”不包括在匹配中。