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})
解释
备选方案的非捕获组(?:
|
单词边界,匹配字符A-Z的0+倍,1+位,点和2位\b[A-Z]*\d+\.\d{2}
或|
匹配空格
关闭非捕获组)
捕获组1,将字母数字匹配2次([A-Z0-9]{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这是一个非捕获组,我将添加一个解释。