如何在 Python 中使用正则表达式从同一个字符串中提取多个值?
Posted
技术标签:
【中文标题】如何在 Python 中使用正则表达式从同一个字符串中提取多个值?【英文标题】:How to extract multiple values from the same String with Regex in Python? 【发布时间】:2017-10-21 02:29:02 【问题描述】:我目前正在尝试从网页中抓取一些数据。我需要的数据在 html 源代码的 <meta>
标记内。使用 BeautifulSoup 抓取数据并将其保存到 String 是没有问题的。
字符串包含我要提取的 2 个数字。这些数字中的每一个(从 1 到 100 的复习分数)都应分配给一个不同的变量以进行进一步处理。
test_str = "<meta content=\"Overall Rating: 79/100 ... Some Info ... Score: 86/100 \"/>"
第一个值是79/100
,第二个是86/100
,但我只需要79
和86
。到目前为止,我已经创建了一个正则表达式搜索来查找这些值,然后 .replace("/100")
进行清理。
但是使用我的代码,我只能得到第一个正则表达式搜索匹配的值,即79
。我尝试使用m.group(1)
获取第二个值,但它不起作用。
我错过了什么?
test_str = "<meta content=\"Overall Rating: 79/100 ... Some Info ... Score: 86/100 \"/>"
m = re.search("../100", test_str)
if m:
found = m.group(0).replace("/100","")
print found
# output -> 79
感谢您的帮助。
最好的问候!
【问题讨论】:
re.findall
返回匹配数组
您是在抓取网页,然后获取整个 HTML 源并将正则表达式应用于它吗?我问是因为您的代码示例没有显示与 beautifulsoup 相关的代码。
谢谢! @Tomalak 不,我只是使用meta_description = soup.find("meta", "name": "rating-data")
将数据保存在字符串中。我只是没有包含 BeautifulSoup 的部分以保持简单。
【参考方案1】:
test_str = "<meta content=\"Overall Rating: 79/100 ... Some Info ... Score: 86/100 \"/>"
m = re.findall('(\d+(?=\/100))', test_str)
# m = ['79', '86']
我将..
更改为/d+
,因此您可以搜索1 位或2 位
我还使用了积极的前瞻(?=...)
,所以.replace
变得不必要了
Regex101 的示例
【讨论】:
Np 很高兴我能帮上忙 :)【参考方案2】:我不知道为什么大多数人不建议对命名组进行反向引用。
您可以执行以下操作,语法可能不完美。
test_str = "<meta content=\"Overall Rating: 79/100 ... Some Info ... Score: 86/100 \"/>"
pattern = "^<meta content=\"Overall Rating: (?P<rating>.*?) ... Some Info ... (?P<score>.*?)$"
match = re.match(pattern, test_str)
match.group('rating')
match.group('score')
【讨论】:
以上是关于如何在 Python 中使用正则表达式从同一个字符串中提取多个值?的主要内容,如果未能解决你的问题,请参考以下文章
python中的正则表达式:如何在模式中使用变量字符串? [复制]
如何使用 python/django 从字符串中提取 url?(使用正则表达式)