我对正则表达式很新,并且无法弄清楚如何做我想要的。我有一个文本文件作为输入,并希望从中提取“文章”。问题是,如果我每行读取文本行,它就无法覆盖整篇文章,因为它在遇到回车时会停止。
我想做的是从特定模式中提取所有内容,直到它重复,无论它是否遇到回车符(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))
答案 0 :(得分:2)
如果可能,请阅读整个文件文本并将以下正则表达式应用于该文本:
(?<=Article)[\s\S]*?(?=Article|$)
<强>解释强>
(?<=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位数。