gpt4 book ai didi

python - 如何使我的标题大小写正则表达式匹配前缀标题?

转载 作者:行者123 更新时间:2023-12-01 06:10:42 25 4
gpt4 key购买 nike

我需要从一段文本中提取可能的标题。例如,我想匹配“Joe Smith”、“The Firm”或“United States of America”等单词。我现在需要修改它以匹配以某种标题开头的名称(例如“Dr. Joe Smith”)。这是我的正则表达式:

NON_CAPPED_WORDS = (
# Articles
'the',
'a',
'an',

# Prepositions
'about',
'after',
'as',
'at',
'before',
'by',
'for',
'from',
'in',
'into',
'like',
'of',
'on',
'to',
'upon',
'with',
'without',
)

TITLES = (
'Dr\.',
'Mr\.',
'Mrs\.',
'Ms\.',
'Gov\.',
'Sen\.',
'Rep\.',
)

# These are words that don't match the normal title case regex, but are still allowed
# in matches
IRREGULAR_WORDS = NON_CAPPED_WORDS + TITLES

non_capped_words_re = r'[\s:,]+|'.join(IRREGULAR_WORDS)
TITLE_RE = re.compile(r"""(?P<title>([A-Z0-9&][a-zA-Z0-9]*[\s,:-]*|{0})+\s*)""".format(non_capped_words_re))

它构建了以下正则表达式:

(?P<title>([A-Z0-9&][a-zA-Z0-9]*[\s,:-]*|the[\s:,]+|a[\s:,]+|an[\s:,]+|about[\s:,]+|after[\s:,]+|as[\s:,]+|at[\s:,]+|before[\s:,]+|by[\s:,]+|for[\s:,]+|from[\s:,]+|in[\s:,]+|into[\s:,]+|like[\s:,]+|of[\s:,]+|on[\s:,]+|to[\s:,]+|upon[\s:,]+|with[\s:,]+|without[\s:,]+|Dr\.[\s:,]+|Mr\.[\s:,]+|Mrs\.[\s:,]+|Ms\.[\s:,]+|Gov\.[\s:,]+|Sen\.[\s:,]+|Rep\.)+\s*)

但这似乎不起作用:

>>> whitelisting.TITLE_RE.findall('Dr. Joe Smith')
[('Dr', 'Dr'), ('Joe Smith', 'Smith')]

有更好的正则表达式的人可以帮我解决正则表达式的困惑吗?

最佳答案

问题似乎是表达式的第一部分,[A-Z0-9&][a-zA-Z0-9]*[\s,:-]*,是吞噬“前缀标题”中的初始字符,因为它们在到达句点之前都是标题大小写的。因此,当 + 重复子表达式并遇到 'Dr.' 时,表达式的初始部分与 'Dr' 匹配,并离开仅非匹配期间。

一个简单的解决方法是简单地将“特殊情况”移动到表达式的前面,以便将它们作为首选方法进行匹配,而不是最后的方法(这实际上只是将 {0} 从表达式末尾到前面):

TITLE_RE = re.compile(r"""(?P<title>({0}|[A-Z0-9&][a-zA-Z0-9]*[\s,:-]*)+\s*)""".format(non_capped_words_re))

结果:

>>> TITLE_RE.findall('Dr. Joe Smith');
[('Dr. Joe Smith', 'Smith')]

我可能会进一步修改表达式以避免 [\s:,]+ 的所有重复,但我不确定除了制作格式化表达式之外还有什么真正的好处看起来好一点:

'|'.join(IRREGULAR_WORDS)
TITLE_RE = re.compile(r"""(?P<title>((?:{0})[\s:,]+|[A-Z0-9&][a-zA-Z0-9]*[\s,:-]*)+\s*)""".format(non_capped_words_re))

关于python - 如何使我的标题大小写正则表达式匹配前缀标题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6146885/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com