检测括号中的两行

时间:2014-04-29 22:06:41

标签: python python-2.7

如果我有这样的文字

1
<src> he is a [man]</src>
<tgt>lui è un [uomo]</tgt>
2
<src> she is a [woman]</src>
<tgt>lei è una donna</tgt>
3
<src> he works well</src>
<tgt> lui lavora [bene]</tgt>

并且我只想在src和tgt行中存在括号时检测括号之间的字符串,所以在上面的文本中,我只想检测[man] [uomo],因为在src行中是[男人]并且在tgt线中有[uomo]。有人可以帮助我

我试过这段代码

line = str()
num = str()
line1 = str()
num1 = str()

for i, line in enumerate(file):
    lines = iter(filer1)
    if line.startswith("<src>"):
        line += '%s\n' % line.strip()
        num += '%s\n' % filer1[i-1]
    if line.startswith("<tgt>"):
        line1 += '%s\n' % line.strip()
        num1 += '%s\n' % filer1[i-2]
for l in line.splitlines():
      for ll in line1.splitlines():
          for n in num.splitlines():
              for nn in num1.splitlines():
                   if n ==nn:
                      m = re.findall(r"\[(.*?)\]",l)
                      mm = re.findall(r"\[(.*?)\]",ll)
                      if m and mm:
                            print '[{}]'.format(m[0]), '[{}]'.format(mm[0])

2 个答案:

答案 0 :(得分:1)

基本上,你应该做的是:首先,清理你的文本输入,以便你有一个列表列表,其中每个子列表包含一个src行和一个tgt行。然后,遍历这些行,并使用re来测试src和tgt中方括号内是否存在文本。如果src和tgt都有括号内的文本,请显示它们;否则,不要。

这应该非常简单,应该如下所示:

import re

# see <http://stackoverflow.com/a/312464/1535629>
def chunks(l, n):
    for i in xrange(0, len(l), n):
        yield l[i:i+n]

text = '''1
<src> he is a [man]</src>
<tgt>lui è un [uomo]</tgt>
2
<src> she is a [woman]</src>
<tgt>lei è una donna</tgt>
3
<src> he works well</src>
<tgt> lui lavora [bene]</tgt>'''
lines = text.split('\n')
linepairs = [chunk[1:] for chunk in chunks(lines, 3)]

regex = re.compile(r'\[\w*\]')
for src, tgt in linepairs:
    src_match = re.search(regex, src)
    tgt_match = re.search(regex, tgt)
    if src_match and tgt_match:
        print(src_match.group(), tgt_match.group())

结果:

[man] [uomo]

答案 1 :(得分:0)

假设您的文件严格遵循三行模式,您可以

# assumes Python 2.7
from itertools import izip_longest
import re

INPUT = "translations.txt"

# from itertools documentation
def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

in_brackets = re.compile("\[(.*?)\]").search

def main():
    with open(INPUT) as inf:
        for num,en,it in grouper(inf, 3, ""):
            en = in_brackets(en)
            it = in_brackets(it)
            if en and it:
                print("[{}] -> [{}]".format(en.group(1), it.group(1)))

main()