【问题标题】:Extract two patterns at once using regex使用正则表达式一次提取两个模式
【发布时间】:2019-02-18 17:29:01
【问题描述】:

我有一个字符串列表,每个字符串都有以下模式(一组单词后跟括号,用逗号分隔的单词):

"vw xy zz (X, Y, Z)"

我想要的输出是:

["vw xy zz", "X", "Y", "Z"]

我知道如何提取括号前的文字:

import re
pattern = r"(^[^\(]+)"
text = "vw xy zz (X, Y, Z)"
re.findall(pattern, text)
# ['vw xy zz ']

我也知道如何提取括号之间的文字:

pattern = r"\(.*\)"
text = "vw xy zz (X, Y, Z)"
re.findall(pattern, text)
# ['(X, Y, Z)']

但我想知道是否有一种方法可以组合模式以一次获得所需的输出。

【问题讨论】:

  • re.findall(r'[^(),\s](?:[^(),]*[^(),\s])?', s) - 一次完成,无需修剪项目。允许任何字符,但括号和逗号除外。 Demo

标签: python regex


【解决方案1】:

如果值不仅是字母数字,而且可能包含除空格和逗号之外的任何字符,我建议使用基于否定字符类的“通用”正则表达式:

re.findall(r'[^(),\s](?:[^(),]*[^(),\s])?', s)

请参阅regex demo

re.findall返回所有匹配项后的项目无需strip()

详情

  • [^(),\s] - 一个 negated character class 匹配除 (), 和空格以外的任何字符
  • (?:[^(),]*[^(),\s])? - 1 或 0 次出现:
    • [^(),]* - 任何字符,但 (),
    • [^(),\s] - 任何字符,但 (), 和空格

【讨论】:

  • 很好的答案:)
  • 最好的一个,这将完全符合您的要求
【解决方案2】:

你可以使用re.findall:

s = "vw xy zz (X, Y, Z)"
result = [i.strip() for i in re.findall('[\w\s]+', s)]

输出:

['vw xy zz', 'X', 'Y', 'Z']

【讨论】:

    【解决方案3】:

    const regex = /([a-zA-Z]{1,2}\s?){3}|[A-Z]/g
    
    const text = "vw xy zz (X, Y, Z)"
    const res = text.match(regex);
    console.log(res)

    此正则表达式将匹配:["vw xy zz ", "X", "Y", "Z"]

    你可以在这里测试regex tester

    ([a-zA-Z]{1,2}\s){3}|[A-Z]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-11
      • 2018-11-22
      • 2021-06-27
      相关资源
      最近更新 更多