如何使titlecase正则表达式与前缀标题匹配?

2024-05-22 09:36:56 发布

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

我需要从一大块文本中抽出可能的标题。比如说“我想和美国的乔·史密斯相配”。我现在需要修改它以匹配以某个标题开头的名称(例如“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))

它将生成以下正则表达式:

^{pr2}$

但这似乎行不通:

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

谁有更好的正则表达式fu可以帮助我解决这个混乱的正则表达式?在


Tags: theinre标题titlearesmithwords
1条回答
网友
1楼 · 发布于 2024-05-22 09:36:56

问题似乎是表达式的第一部分[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))

结果:

^{pr2}$

我可能会进一步修改表达式以避免[\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))

相关问题 更多 >