正则表达式:使用Python在字符串中查找姓名

3 投票
2 回答
2058 浏览
提问于 2025-04-18 08:55

我之前对正则表达式一直没有太大的困扰,但这次遇到的问题让我花了几个小时,希望解决方案不是显而易见的。

这是我的字符串:

<b>Carson Daly</b>: <a href="https://rads.stackoverflow.com/amzn/click/com/B009DA74O8" rel="nofollow noreferrer">Ben Schwartz</a>, Soko, Jacob Escobedo (R 2/28/14)<br>'

我想把'Soko'和'Jacob Escobedo'提取出来,作为单独的字符串。如果提取的方法不同也没关系。

我试过用"\s([A-Za-z0-9]{1}.+?),"这样的正则表达式来获取我想要的数据,但一直没有成功。任何帮助都非常感谢。

这些名字前面从来没有相同的标签或符号,唯一始终出现在名字前面的就是一个空格(\s)。

这里还有另一个字符串作为例子:

<b>Carson Daly</b>: Wil Wheaton, the Birds of Satan, Courtney Kemp Agboh<br>

2 个回答

1

如果你想用正则表达式来解决这个问题(当然,正则表达式有很多需要注意的地方),下面这个正则表达式可以处理你的字符串。不过要记得,你需要从捕获组1中获取匹配的结果。在这个在线演示中,确保查看右下角的组1捕获结果。:)

<[^<]*</[^>]*>|<.*?>|((?<=,\s)\w[\w ]*\w|\w[\w ]*\w(?=,))

简单来说,左边的选择(用|分隔)是用来匹配我们不想要的内容,而右边最后的括号则捕获我们想要的内容。

这实际上是关于在特定情况下匹配模式的一个应用(可以阅读那篇文章获取实现细节,包括Python代码的链接)。

2

另一种方法是使用HTML解析器来解析字符串,比如lxml

举个例子,你可以使用xpath来找到一个包含Carson Daly文本的b标签和br标签之间的所有内容,方法是检查它们的precedingfollowing兄弟元素:

from lxml.html import fromstring

l = [
    """<b>Carson Daly</b>: <a href="http://rads.stackoverflow.com/amzn/click/B009DA74O8">Ben Schwartz</a>, Soko, Jacob Escobedo (R 2/28/14)<br>'""",
    """<b>Carson Daly</b>: Wil Wheaton, the Birds of Satan, Courtney Kemp Agboh<br>"""
]

for html in l:
    tree = fromstring(html)
    results = ''
    for element in tree.xpath('//node()[preceding-sibling::b="Carson Daly" and following-sibling::br]'):
        if not isinstance(element, str):
            results += element.text.strip()
        else:
            text = element.strip(':')
            if text:
                results += text.strip()

    print results.split(', ')

它会输出:

['Ben Schwartz', 'Soko', 'Jacob Escobedo (R 2/28/14)']
['Wil Wheaton', 'the Birds of Satan', 'Courtney Kemp Agboh']

撰写回答