如何在python中使用正则表达式将句子与多个点匹配?

2024-09-30 22:26:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Python中的re.txt文件中查找问题和答案。 以下是文本文件的示例:

1. Xiva xonligining yirik shaharlari xato berilgan javobni aniqlang.
A) Xiva, Kat        
B) Yangi Urganch, Hazorasp    
C) Qo'ng'irot, Xo'jayli   
D) Vazir, Mang'it
2. Xiva xonligi Buxoro amirligi kabi bekliklarga bo'lingan bo'lib, ularni xon tomonidan tayinlangan ......... boshqargan.
A) beklar         
B) noiblar     
C) beklar va to'ralar      
D) biy va beklar

不要介意语言。问题以数字开头,后跟.,然后是问题正文(通常以?.!结尾)

然后是从AD的答案,后面是结束括号)

这是我用来查找问题的正则表达式:re"^(\d+\.)?\s+[\"’]?([.]{2,})?[A-Z][^.?!]+((?![.?!][’\"]?\s[\"’]?[A-Z][^.?!]).)+[.?!’\"]+$"

我的问题是,当问题体中有多个点,如问题#2,我的正则表达式无法匹配整个问题体。而是在它看到的第一个点处停止。我该怎么做?任何帮助都将不胜感激。谢谢

By the way, here is how I am finding the answers with regex: re"^[a-zA-Z]\)?\s+\w+.+" Suggestions regarding my approach to finding questions and answers are also welcome.


Tags: 文件theto答案retxt示例answers
2条回答

您可以从匹配数字、点和行的其余部分开始。然后有选择地重复所有不以大写字符A-Z后跟)开头的行

如果您只想要问题主体,您可以在一个组中捕获它

^\d+\.[^\S\r\n]*([A-Z].*(?:\r?\n(?![A-Z]\)).*)*[.?!])

解释

  • ^字符串的开头
  • \d+\.[^\S\r\n]*匹配1+个数字、一个.和不带换行符的可选空白字符
  • (捕获组1
    • [A-Z].*匹配大写字符A-Z
    • (?:\r?\n(?![A-Z]\)).*)*可选地重复所有不以大写字符A-Z开头,后跟)的行
    • [.?!]匹配.{}或!
  • )关闭组1

Regex demo

匹配答案^[a-zA-Z]\)?\s+\w+.+的模式有一个可选的),也可以以小写字符a-z开头,例如,它也匹配a test

如果)始终存在,则不必将其设置为可选的,并且可能仅匹配[A-Z]将使更改得到的假阳性稍微小一些

因为您的文本文件格式正确。您可以尝试以下方法提取问题:

re.findall([\d+][\s\S][\w\W]+[\d\D], t)

相关问题 更多 >