分组而不为re.findall()创建新目标

时间:2019-06-30 09:38:33

标签: python regex tuples

我想概括this question 有没有一种方法可以对不扩大re.findall()元组的元素进行分组?

我的例子:

line="(1 (2 (1 (1 (1 (2 You) (1 (2 (2 wo) (2 n't)) (2 (2 like) (2 Roger)))) (2 ,)) (2 but)) (2 (2 you) (3 (3 (2 will) (2 quickly)) (2 (2 recognize) (2 him))))) (2 .))\n"
numR=re.compile(r"\({1}(\d)? ((')*\w+|('|\.|,))\){1}")
re.findall(numR,line)
[('2', 'You', '', ''),
 ('2', 'wo', '', ''),
 ('2', 'like', '', ''),
 ('2', 'Roger', '', ''),
 ('2', ',', '', ','),
 ('2', 'but', '', ''),
 ('2', 'you', '', ''),
 ('2', 'will', '', ''),
 ('2', 'quickly', '', ''),
 ('2', 'recognize', '', ''),
 ('2', 'him', '', ''),
 ('2', '.', '', '.')]

如您所见,元组末尾包含2个不必要的元素

1 个答案:

答案 0 :(得分:3)

在您的模式中,您有4个捕获组。您可以在第二个捕获组中使用一个轮换,总共只有2个捕获组。

\((\d) ([.',]|\w+)\)

说明

  • \(匹配(
  • (\d)组1,捕获一位数字(将\d+用于1位以上数字)
  • (第2组
    • [.',]|\w+匹配字符类别中列出的字符之一,或匹配1个以上的单词字符
  • )关闭第2组
  • \)

Regex demo | Python demo

import re
line="(1 (2 (1 (1 (1 (2 You) (1 (2 (2 wo) (2 n't)) (2 (2 like) (2 Roger)))) (2 ,)) (2 but)) (2 (2 you) (3 (3 (2 will) (2 quickly)) (2 (2 recognize) (2 him))))) (2 .))\n"
numR=re.compile(r"\((\d) ([.',]|\w+)\)")
print(re.findall(numR,line))

结果

[('2', 'You'), ('2', 'wo'), ('2', 'like'), ('2', 'Roger'), ('2', ','), ('2', 'but'), ('2', 'you'), ('2', 'will'), ('2', 'quickly'), ('2', 'recognize'), ('2', 'him'), ('2', '.')]

请注意,您可以省略{1},并且可以使用字符类('|\.|,)来写替换[.',]