Python正则表达式匹配上一组中匹配的内容(多个选项中的1个)

艾伦·斯塔克

可以说我有一个正则表达式(?:AA|BB)(.*)(?:AA|BB),它捕获定界符AABB

我遇到的问题是,这也将匹配 AA...BB

我怎样才能让这个正则表达式只匹配AA...AABB...BB

维克多·史翠比维

如果您需要匹配的字符串以相同的前后定界符开头和结尾,则只需捕获前导定界符并在模式本身内部使用反向引用

(AA|BB)(.*)\1
^     ^    ^^

正则表达式演示

在Python中,re.finditer如果只想获取所需的组,就必须使用,而不必re.findall返回一个元组列表(因此将包含AABB)。要匹配从子字符串AA到第一个子字符串AA,请使用惰性量词*?(AA|BB)(.*?)\1

简短的Python演示

import re
p = re.compile(r'(AA|BB)(.*)\1')
test_str = "AA text AA"
print([x.group(2).strip() for x in p.finditer(test_str)])
# => ['text']

如果您需要使用前导和尾部定界符不匹配的字符串进行匹配,则必须使用alternation

AA(.*)AA|BB(.*)BB

或-惰性量词版本,以匹配最接近的AAs和BBs:

AA(.*?)ZZ|BB(.*?)YY

请注意,这将在结果中输出空元素,因为仅会匹配一组。在大多数Python版本中,如果计划在re.sub(直到Python 3.5,未匹配的组未使用空字符串(= None)初始化,并且可能引发异常)中使用该模式,则应谨慎使用

下面是一个提取样本代码re.finditer

import re
p = re.compile(r'(AA)(.*?)(ZZ)|(BB)(.*?)(YY)')
test_str = "AA Text 1 here ZZ and BB Text2 there YY"
print("Contents:") 
print([x.group(2).strip() for x in p.finditer(test_str) if x.group(2)])
print([x.group(5).strip() for x in p.finditer(test_str) if x.group(5)])
print("Delimiters:")
print([(x.group(1), x.group(3)) for x in p.finditer(test_str) if x.group(1) and x.group(3)])
print([(x.group(4), x.group(6)) for x in p.finditer(test_str) if x.group(4) and x.group(6)])

结果:

Contents:
['Text 1 here']
['Text2 there']
Delimiters:
[('AA', 'ZZ')]
[('BB', 'YY')]

在现实生活中,使用非常长且复杂的文本,可以展开这些正则表达式以使匹配线性和高效,但这是另一回事。

最后但并非最不重要的一点是,如果您需要将一个定界符中的最短子字符串与其中不包含这些定界符的另一个子字符串进行匹配,请使用经过调节的贪婪标记

AA((?:(?!AA|ZZ).)*)ZZ|BB((?:(?!BB|YY).)*)YY
   ^^^^^^^^^^^^^^^       ^^^^^^^^^^^^^^^ 

请参阅regex演示以了解与的区别AA(.*?)ZZ|BB(.*?)YY

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

正则表达式匹配JavaScript中的反向组

来自分类Dev

正则表达式在引号中查找组匹配

来自分类Dev

正则表达式:匹配句号和python中的一个单词

来自分类Dev

Python正则表达式中的上一个分组匹配

来自分类Dev

匹配一组几乎相等的元素中的单个元素的正则表达式是什么?

来自分类Dev

确定正则表达式中匹配的组

来自分类Dev

Python正则表达式:提取多个匹配组

来自分类Dev

Vim中的正则表达式以匹配组捕获

来自分类Dev

替换正则表达式匹配中的命名组

来自分类Dev

正则表达式只匹配一组可能的字符串中的一个值,而不匹配该组中的多个字符串

来自分类Dev

正则表达式:需要匹配一组字符而不匹配另一组字符

来自分类Dev

正则表达式匹配,如果字符串中的多个选项中只有一个匹配项

来自分类Dev

正则表达式:匹配一组字符中的字符串,但需要精确计数特定字符的X

来自分类Dev

在正则表达式中如何匹配多个或条件但排除一个条件

来自分类Dev

Python正则表达式不匹配多个组

来自分类Dev

正则表达式仅匹配一组

来自分类Dev

Perl正则表达式-匹配上一个字符

来自分类Dev

正则表达式与PHP中的内容不匹配

来自分类Dev

匹配直到正则表达式中的另一个表达式

来自分类Dev

正则表达式只匹配一组可能的字符串中的一个值,而不匹配该组中的多个字符串

来自分类Dev

在Java正则表达式中匹配多个组

来自分类Dev

正则表达式:跳过组中角色的第一个匹配项?

来自分类Dev

正则表达式匹配一个或多个组太多

来自分类Dev

无法匹配正则表达式组中的括号

来自分类Dev

Java中的正则表达式组匹配

来自分类Dev

Java正则表达式匹配列表中的一个或多个字符

来自分类Dev

.net 中的正则表达式 - 匹配引号中的第一组,忽略嵌套引号

来自分类Dev

在正则表达式中匹配一个或多个

来自分类Dev

如何在递归正则表达式中匹配一个组?

Related 相关文章

  1. 1

    正则表达式匹配JavaScript中的反向组

  2. 2

    正则表达式在引号中查找组匹配

  3. 3

    正则表达式:匹配句号和python中的一个单词

  4. 4

    Python正则表达式中的上一个分组匹配

  5. 5

    匹配一组几乎相等的元素中的单个元素的正则表达式是什么?

  6. 6

    确定正则表达式中匹配的组

  7. 7

    Python正则表达式:提取多个匹配组

  8. 8

    Vim中的正则表达式以匹配组捕获

  9. 9

    替换正则表达式匹配中的命名组

  10. 10

    正则表达式只匹配一组可能的字符串中的一个值,而不匹配该组中的多个字符串

  11. 11

    正则表达式:需要匹配一组字符而不匹配另一组字符

  12. 12

    正则表达式匹配,如果字符串中的多个选项中只有一个匹配项

  13. 13

    正则表达式:匹配一组字符中的字符串,但需要精确计数特定字符的X

  14. 14

    在正则表达式中如何匹配多个或条件但排除一个条件

  15. 15

    Python正则表达式不匹配多个组

  16. 16

    正则表达式仅匹配一组

  17. 17

    Perl正则表达式-匹配上一个字符

  18. 18

    正则表达式与PHP中的内容不匹配

  19. 19

    匹配直到正则表达式中的另一个表达式

  20. 20

    正则表达式只匹配一组可能的字符串中的一个值,而不匹配该组中的多个字符串

  21. 21

    在Java正则表达式中匹配多个组

  22. 22

    正则表达式:跳过组中角色的第一个匹配项?

  23. 23

    正则表达式匹配一个或多个组太多

  24. 24

    无法匹配正则表达式组中的括号

  25. 25

    Java中的正则表达式组匹配

  26. 26

    Java正则表达式匹配列表中的一个或多个字符

  27. 27

    .net 中的正则表达式 - 匹配引号中的第一组,忽略嵌套引号

  28. 28

    在正则表达式中匹配一个或多个

  29. 29

    如何在递归正则表达式中匹配一个组?

热门标签

归档