如何在一个正则表达式中捕获所有正则表达式组?

时间:2016-04-18 06:20:29

标签: python regex string delimiter regex-group

给出这样的文件:

# For more information about CC-CEDICT see:
# http://cc-cedict.org/wiki/
A A [A] /(slang) (Tw) to steal/
AA制 AA制 [A A zhi4] /to split the bill/to go Dutch/
AB制 AB制 [A B zhi4] /to split the bill (where the male counterpart foots the larger portion of the sum)/(theater) a system where two actors take turns in acting the main role, with one actor replacing the other if either is unavailable/
A咖 A咖 [A ka1] /class "A"/top grade/
A圈兒 A圈儿 [A quan1 r5] /at symbol, @/
A片 A片 [A pian4] /adult movie/pornography/

我想构建一个json对象:

  • 跳过以#
  • 开头的行
  • 将线条分成4个部分
    1. 传统角色(从开始^跨越到下一个空间)
    2. 简化字符(从第一个空间跨越到第二个空格)
    3. 拼音(跨在方括号[...]之间)
    4. 第一个/到最后一个/之间的光泽空间(请注意,有些情况下光泽内可能存在斜线,例如/adult movie/pornography/

我目前正在这样做:

>>> for line in text.split('\n'):
...     if line.startswith('#'): continue;
...     line = line.strip()
...     simple, _, line = line.partition(' ')
...     trad, _, line = line.partition(' ')
...     print simple, trad
... 
A A
AA制 AA制
AB制 AB制
A咖 A咖
A圈兒 A圈儿
A片 A片

要获得[...],我必须这样做:

>>> import re
>>> line = "A片 A片 [A pian4] /adult movie/pornography/"
>>> simple, _, line = line.partition(' ')
>>> trad, _, line = line.partition(' ')
>>> re.findall(r'\[.*\]', line)[0].strip('[]')
'A pian4'

要找到/.../,我必须这样做:

>>> line = "A片 A片 [A pian4] /adult movie/pornography/"
>>> re.findall(r'\/.*\/$', line)[0].strip('/')
'adult movie/pornography'

如何使用正则表达式组一次性捕获所有这些进行多个分区/拆分/ findall?

4 个答案:

答案 0 :(得分:6)

我可以使用正则表达式来提取信息。这样,您可以捕获组中的块,然后根据需要处理它们:

import re

with open("myfile") as f:
    data = f.read().split('\n')
    for line in data:
        if line.startswith('#'): continue
        m = re.search(r"^([^ ]*) ([^ ]*) \[([^]]*)\] \/(.*)\/$", line)
        if m:
            print(m.groups())

这是正则表达式拆分以下组中的字符串:

^([^ ]*) ([^ ]*) \[([^]]*)\] \/(.*)\/$
  ^^^^^   ^^^^^     ^^^^^       ^^
   1)      2)        3)         4)

那是:

  1. 第一个字。

  2. 第二个字。

  3. []内的文字。

  4. /到行尾之前的/的文字。

  5. 它返回:

    ('A', 'A', 'A', '(slang) (Tw) to steal')
    ('AA制', 'AA制', 'A A zhi4', 'to split the bill/to go Dutch')
    ('AB制', 'AB制', 'A B zhi4', 'to split the bill (where the male counterpart foots the larger portion of the sum)/(theater) a system where two actors take turns in acting the main role, with one actor replacing the other if either is unavailable')
    ('A咖', 'A咖', 'A ka1', 'class "A"/top grade')
    ('A圈兒', 'A圈儿', 'A quan1 r5', 'at symbol, @')
    ('A片', 'A片', 'A pian4', 'adult movie/pornography')
    

答案 1 :(得分:3)

p = re.compile(ru"(\S+)\s+(\S+)\s+\[([^\]]*)\]\s+/(.*)/$")
m = p.match(line)
if m:
    simple, trad, pinyin, gloss = m.groups()

有关详细信息,请参阅https://docs.python.org/2/howto/regex.html#grouping

答案 2 :(得分:2)

这可能会有所帮助:

preg = re.compile(r'^(?<!#)(\w+)\s(\w+)\s(\[.*?\])\s/(.+)/$',
                  re.MULTILINE | re.UNICODE)

with open('your_file') as f:
    for line in f:
        match = preg.match(line)
        if match:
            print(match.groups())

查看here以获取使用的正则表达式的详细说明。

答案 3 :(得分:1)

我创建了以下正则表达式以匹配所有四个组:

REGEX DEMO

^(.*)\s(.*)\s(\[.*\])\s(\/.*\/)

这确实假设组之间只有一个空格,但如果你有更多空间,你可以添加一个修饰符。

这是一个演示如何使用python与问题中提供的行:

IDEONE DEMO