正则表达式:使用Python在字符串中查找姓名
我之前对正则表达式一直没有太大的困扰,但这次遇到的问题让我花了几个小时,希望解决方案不是显而易见的。
这是我的字符串:
<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
标签之间的所有内容,方法是检查它们的preceding
和following
兄弟元素:
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']