匹配文本

时间:2017-12-26 14:29:39

标签: python regex

我对正则表达式很新,并且无法弄清楚如何做我想要的。我有一个文本文件作为输入,并希望从中提取“文章”。问题是,如果我每行读取文本行,它就无法覆盖整篇文章,因为它在遇到回车时会停止。

我想做的是从特定模式中提取所有内容,直到它重复,无论它是否遇到回车符(Python)。

序列示例:

Article ler — NOM
Latius iam disseminata licentia onerosus bonis omnibus Caesar nullum post haec adhibens modum orientis latera cuncta vexabat nec honoratis parcens nec urbium primatibus nec plebeiis.
Article 2 — ANNEE
Nemo quaeso miretur, si post exsudatos labores itinerum longos congestosque adfatim commeatus fiducia vestri ductante barbaricos pagos adventans velut mutato repente consilio ad placidiora deverti.
Article 3 — DATE Ego vero sic intellego, Patres conscripti, nos hoc tempore in provinciis decernendis perpetuae pacis habere oportere rationem.

这是我设计的正则表达式:"^(.*(?=((?i)article(\s\d{1,2})*)).*)"

作为输出,我得到类似的东西:

Article ler — NOM
Article 2 — ANNEE
Article 3 — DATE Ego vero sic intellego, Patres conscripti, nos hoc tempore in provinciis decernendis perpetuae pacis habere oportere rationem.

前两个不包括整篇文章(标题+内容):这是我的问题。 有人知道怎么解决吗?

谢谢!

if __name__ == "__main__":

    label_pattern = ("^(.*(?=((?i)article(\s\d{1,2})*)).*)")

    pattern = re.compile(label_pattern)

    for i, line in enumerate(open('texte.txt')):
        for match in re.finditer(pattern, line):
            print(i+1, match.group(1))

2 个答案:

答案 0 :(得分:2)

如果可能,请阅读整个文件文本并将以下正则表达式应用于该文本:

(?<=Article)[\s\S]*?(?=Article|$)

Click for Demo

<强>解释

  • (?<=Article) - 在文字Article
  • 之后立即查找位置的正面观察
  • [\s\S]*? - 匹配任何字符的出现次数(甚至是换行符)。存在?以使匹配变得懒惰。
  • (?=Article|$) - 找到由Article
  • 代表的另一个$或完整字符串结尾后紧跟的排名的正面预测

答案 1 :(得分:1)

您的问题是您阅读文件的方式。如果您遍历文件中的行,那么您将无法获得多行匹配。相反,如果要使用正则表达式,请立即读取整个文件。

(旁注:如果不使用正则表达式,可能有更好的方法来实现此结果。)

import re

label_pattern = (r"(?<=^)(article )(\d{1,2})((.)|(\n))+?(?=(^(article)|(\Z)))")

pattern = re.compile(label_pattern, flags=re.IGNORECASE | re.MULTILINE)

file_text = open('texte.txt').read()  # read the whole file

for i, match in enumerate(re.finditer(label_pattern, file_text, flags=re.IGNORECASE | re.MULTILINE)):
    print("MATCH %d:\n%s" % (i+1, match.group()))

输出结果为:

MATCH 1:
Article 1er - NOM
Latius iam disseminata licentia onerosus bonis omnibus Caesar nullum post haec adhibens modum orientis latera cuncta vexabat nec honoratis parcens nec urbium primatibus nec plebeiis.

MATCH 2:
Article 2 - ANNEE
Nemo quaeso miretur, si post exsudatos labores itinerum longos congestosque adfatim commeatus fiducia vestri ductante barbaricos pagos adventans velut mutato repente consilio ad placidiora deverti.

MATCH 3:
Article 3 - DATE Ego vero sic intellego, Patres conscripti, nos hoc tempore in provinciis decernendis perpetuae pacis habere oportere rationem.

另外,我假设第一行的示例文本中有拼写错误。您写了"Article ler",但我认为您的意思是&#34; Article 1er"(数字1而不是字母l)。如果我没有做出这样的改变,那么你就不会得到第一篇文章,因为该模式正在寻找&#34;文章&#34;后跟1或2位数。