如标题中所述我希望正则表达式根据我的'查询'按顺序给我结果。
line='VERSION="OTHER" POWER="LOW" FREQ="OFF" MAXTUN="BLER"'**
示例1:
re.findall(r'FREQ="(.*?)"|VERSION="(.*?)"', line, re.MULTILINE)
输出是:
[('', 'OTHER'), ('OFF', '')]
我更喜欢的输出是:
['OFF', 'OTHER']
示例2:
re.findall(r'VERSION="(.*?)"|FREQ="(.*?)"', line, re.MULTILINE)
输出相同:
[('', 'OTHER'), ('OFF', '')]
我更喜欢的输出是:
['OTHER', 'OFF']
有什么建议吗?
P.S。 请不要问我想达到什么目的,并告诉我可能有更好的方法,只要你对此有一些疑问。
谢谢!
答案 0 :(得分:3)
您可以利用非捕获更改组来匹配VERSION
或FREQ
(可选地在单词边界之前,只需检查它是否符合您的要求):
\b(?:VERSION|FREQ)="(.*?)"
请参阅regex demo
<强>详情
\b
- 领先的单词边界(?:VERSION|FREQ)
- VERSION
或FREQ
="
- ="
子字符串(.*?)
- 第1组(findall
的实际输出):除了换行符之外的任何0 +字符,尽可能少"
- 双引号。请参阅Python demo:
import re
line='VERSION="OTHER" POWER="LOW" FREQ="OFF" MAXTUN="BLER"'
print(re.findall(r'\b(?:VERSION|FREQ)="(.*?)"', line))
# => ['OTHER', 'OFF']
或许更好的想法是捕获键值对并将它们映射到字典:
import re
line = 'VERSION="OTHER" POWER="LOW" FREQ="OFF" MAXTUN="BLER"'
results = re.findall(r'(VERSION|FREQ)="(.*?)"', line)
print(dict(results))
# => {'FREQ': 'OFF', 'VERSION': 'OTHER'}
请参阅Python demo。
答案 1 :(得分:0)
我担心使用正则表达式无法按照您想要的顺序进行匹配:您可以在执行之前执行该部分。首先,然后是|之后的部分。或者之后订购结果。