通过一个正则表达式以任何顺序匹配多个单词

时间:2017-11-13 10:38:52

标签: regex python-3.x

如标题中所述我希望正则表达式根据我的'查询'按顺序给我结果。

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。 请不要问我想达到什么目的,并告诉我可能有更好的方法,只要你对此有一些疑问。

谢谢!

2 个答案:

答案 0 :(得分:3)

您可以利用非捕获更改组来匹配VERSIONFREQ(可选地在单词边界之前,只需检查它是否符合您的要求):

\b(?:VERSION|FREQ)="(.*?)"

请参阅regex demo

<强>详情

  • \b - 领先的单词边界
  • (?:VERSION|FREQ) - VERSIONFREQ
  • =" - ="子字符串
  • (.*?) - 第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)

我担心使用正则表达式无法按照您想要的顺序进行匹配:您可以在执行之前执行该部分。首先,然后是|之后的部分。或者之后订购结果。