Python 正则表达式以捕获进程文本 - 在组中混合 cas 不敏感

问题描述 投票:0回答:1

示例链接

RegEx Group 返回问题: (?P(Q|A|Mr[.|:]?[a-z]+|Mrs[.|:]?[a-z]+|Ms[.|:]?[a-z]+|Miss[.|: ]?[a-z]+|Dr[.|:]?[a-z]+))?([.|:|\s]+)?

目标: 从每个问题/答案/演讲者类型的会议记录 pdf 中提取文本。

使用 Python:通过 PDF 中的页面交互提取文本和组问题/答案文本。

Desired Results = qa_type, page_start, page_end, line_num_start, line_num_end, qa_text

问题: 对于 [Q|A] 指示符,我只需要大写字母,但对于演讲者的头衔(先生、夫人、博士等),需要不区分大小写,Q|A 和演讲者称呼都是一个“qa_type”组.

请求:如何防止'qa_type'捕获'a'或'q'?请参阅第 275 页第 2 行和第 17 行。

Example bad extract - line 17 'a'

regex = r"(^(?P[1-9]|1[0-9]|2[0-2]) +)(?P(Q|A|Mr[.|:]? [a-z]+|Mrs[.|:]?[a-z]+|Ms[.|:]?[a-z]+|Miss[.|:]?[a-z]+|Dr[.|:]?[a-z ]+))?([.|:|\s]+)?(?P.*)|页面 (?P\d{1,3})"

python regex case-insensitive
1个回答
0
投票

这听起来很像这个问题。不幸的是,似乎 python 内联标志修饰符已被弃用。您仍然可以尝试使用它们,在这种情况下,您的正则表达式将如下所示(没有全局不区分大小写的标志):

(^(?P<line_num>[1-9]|1[0-9]|2[0-2])\b +)(?P<qa_type>(Q|A|(?i)Mr[.|:]? [a-z]+|Mrs[.|:]? [a-z]+|Ms[.|:]? [a-z]+|Miss[.|:]? [a-z]+|Dr[.|:]? [a-z]+(?-i)))?([.|:|\s]+)?(?P<type_text>\b.*)|(?i)page(?-i) (?P<page_num>\d{1,3})

另一种方法是每次需要不区分大小写的字母时都指定小写和大写字符(同样,没有全局不区分大小写标志):

(^(?P<line_num>[1-9]|1[0-9]|2[0-2])\b +)(?P<qa_type>(Q|A|[mM][rR][.|:]? [a-zA-Z]+|[mM][rR][sS][.|:]? [a-zA-Z]+|[mM][sS][.|:]? [a-zA-Z]+|[mM][iI][sS][sS][.|:]? [a-zA-Z]+|[dD][rR][.|:]? [a-zA-Z]+))?([.|:|\s]+)?(?P<type_text>\b.*)|[pP][aA][gG][eE] (?P<page_num>\d{1,3})

更新的 regex101 链接

© www.soinside.com 2019 - 2024. All rights reserved.