Python 正则表达式-如何在一个组中捕获两个模式?

Python 正则表达式-如何在一个组中捕获两个模式?,python,regex,Python,Regex,我想将两种不同的模式捕获到一个捕获/匹配组中。这可能吗 第一种模式:由空格包围的两个字符的字母数字([A-Z0-9]{2}) 第二种模式:两个字符的字母数字加上字母数字和一个十进制值,后跟空格\b[a-Z]*\d+\.\d{2}([a-Z0-9]{2}) 这两个模式一起捕获我想要的所有内容,但问题是我需要它们位于单个捕获组中,并且按照捕获的顺序(请参见预期输出) 测试字符串 ABC WS PIT342.55USD342.55END ABC WS YMQ234.03WS TOY234.03USD4

我想将两种不同的模式捕获到一个捕获/匹配组中。这可能吗

第一种模式:由空格包围的两个字符的字母数字
([A-Z0-9]{2})

第二种模式:两个字符的字母数字加上字母数字和一个十进制值,后跟空格
\b[a-Z]*\d+\.\d{2}([a-Z0-9]{2})

这两个模式一起捕获我想要的所有内容,但问题是我需要它们位于单个捕获组中,并且按照捕获的顺序(请参见预期输出)

测试字符串

ABC WS PIT342.55USD342.55END
ABC WS YMQ234.03WS TOY234.03USD468.06END
FUR BB LAB Q10.00 199.00USD209.00END
YAS DG TYY Q AWSMSN11.32 2503.08LD VET Q JKLOLE11.32 2503.08USD5028.80END
PPP VP LAP Q10.00 M342.41EE SFD Q10.00 282.24USD644.65END
YAS DL X/XXX MO X/POP DF PSC241.30ET X/SAE DL X/KOO DL CSG269.80USD511.10END

预期产量

+------------------------------------------------------------------------------+------------------------+
| ABC WS PIT342.55USD342.55END                                                 | WS                     |
| ABC WS YMQ234.03WS TOY234.03USD468.06END                                     | WS, WS                 |
| FUR BB LAB Q10.00 199.00USD209.00END                                         | BB                     |
| YAS DG TYY Q AWSMSN11.32 2503.08LD VET Q JKLOLE11.32 2503.08USD5028.80END    | DG, LD                 |
| PPP VP LAP Q10.00 M342.41EE SFD Q10.00 282.24USD644.65END                    | VP, EE                 |
| YAS DL X/XXX MO X/POP DF PSC241.30ET X/SAE DL X/KOO DL CSG269.80USD511.10END | DL, MO, DF, ET, DL, DL |
+------------------------------------------------------------------------------+------------------------+

您可以省略字符类
[A-Z]*
中的空格,因为它与本部分
WS-YMQ234.03WS
中的第一个
WS
不匹配

由于两个模式的结尾都是相同的,都是2个字母数字和空格,因此可以使用
匹配前面的空格或第二个模式的第一部分

(?:\b[A-Z]*\d+\.\d{2}| )([A-Z0-9]{2}) 
解释

  • (?:
    备选方案的非捕获组
    |
    • \b[A-Z]*\d+\.\d{2}
      单词边界,匹配字符A-Z的0+倍,1+位,点和2位
    • |
      匹配空格
  • 关闭非捕获组
  • ([A-Z0-9]{2})
    捕获组1,将字母数字匹配2次
|

示例代码

import re

strings = [
    "ABC WS PIT342.55USD342.55END",
    "ABC WS YMQ234.03WS TOY234.03USD468.06END",
    "FUR BB LAB Q10.00 199.00USD209.00END",
    "YAS DG TYY Q AWSMSN11.32 2503.08LD VET Q JKLOLE11.32 2503.08USD5028.80END",
    "PPP VP LAP Q10.00 M342.41EE SFD Q10.00 282.24USD644.65END",
    "YAS DL X/XXX MO X/POP DF PSC241.30ET X/SAE DL X/KOO DL CSG269.80USD511.10END"
]

for s in strings: 
    print(re.findall(r"(?:\b[A-Z]*\d+\.\d{2}| )([A-Z0-9]{2}) ", s))
输出

['WS']
['WS', 'WS']
['BB']
['DG', 'LD']
['VP', 'EE']
['DL', 'MO', 'DF', 'ET', 'DL', 'DL']

(?:\b[A-Z]*\d+\.\d{2}([A-Z0-9]{2}))?([A-Z0-9]{2})
有效吗?您可以通过转义或将它们包含在字符类(
[]
)中,使正则表达式末尾的空格更加清晰。我不确定是否将这两种模式都包含在一组中,但如果您想要预期的输出,还可以使用两组来获得它。(?:\b\w+?\。\d{2})([A-Z]{2}\b)|(\b[A-Z]{2}\b)我在你给出的链接中测试了这一点,我可以在一组中看到这两种模式。试试这个-(?:\b\w+?\。\d{2})?[^A-Z]([A-Z]{2}\b)什么是
?:
做什么?@nobody这是一个非捕获组,我将添加一个解释。