使用正则表达式一次提取两个模式

时间:2019-02-18 17:29:02

标签: python regex

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

$brand

我想要的输出是:

"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 ']

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

3 个答案:

答案 0 :(得分:3)

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

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

请参见regex demo

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

详细信息

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

答案 1 :(得分:1)

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]

答案 2 :(得分:1)

您可以使用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']