如何在 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,但我只需要7986。到目前为止,我已经创建了一个正则表达式搜索来查找这些值,然后 .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?(使用正则表达式)

如何使用 Python 处理 JSON 文件中的正则表达式字符串

正则表达式

仅使用 python 正则表达式从最新的字符串中获取

如何在 Python 中使用正则表达式提取 JSON 字符串的特定部分?