如何在两个不同的匹配之间提取文本?

时间:2010-06-22 17:31:38

标签: python regex

我有一个文本文件,其中包含我需要提取的文本集,如下所示:

ITEM A blah blah blah ITEM B bloo bloo bloo ITEM A blee blee blee ITEM B

这是我到目前为止的工作代码:

finda = r'(Item\sA)'
findb = r'(Item\sB)'
match_a = re.finditer(finda, usefile, 2)  # the "2" is a flag to say ignore case
match_b = re.finditer(findb, usefile, 2)

我知道我可以使用span,start和end之类的命令来查找匹配项的文本位置。但我需要多次这样做,所以我需要的是:

  1. 开始在ITEM A写作并停止在ITEM B上写作。
  2. 如果第一次迭代的长度小于50个字符,则丢弃并移至下一个
  3. 一旦找到以ITEM A开头并以ITEM B结尾并且大于50个字符的集合将其写入文件
  4. 提前感谢!我一直在转动轮子。

2 个答案:

答案 0 :(得分:2)

为什么不呢:

with open(fname, 'w') as file:
    for match in re.finditer(r'Item A(.+?)Item B', subject, re.I):
        s = match.group(1)
        if len(s) > 50:
            file.write(s)

注意:使用flags的实际数值是相当倾斜的,使用re标志中提供。

答案 1 :(得分:2)

这可以在一个正则表达式中完成:

with open("output.txt", "w") as f:
    for match in re.finditer(r"(?<=Item\sA)(?:(?!Item\sB).){50,}(?=Item\sB)", subject, re.I):
        f.write(match.group()+"\n")

这与项目A和项目B之间的匹配。或者您是否也希望匹配分隔符?

正则表达式解释说:

(?<=Item\sA)   # assert that we start our match right after "Item A"
(?:            # start repeated group (non-capturing)
  (?!Item\sB)  # assert that we're not running into "Item B"
  .            # then match any character
){50,}         # repeat this at least 50 times
(?=Item\sB)    # then assert that "Item B" follows next (without making it part of the match)