首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Python提取具有特定模式的子字符串,该子字符串由字符串中的任何字符分隔?

如何使用Python提取具有特定模式的子字符串,该子字符串由字符串中的任何字符分隔?
EN

Stack Overflow用户
提问于 2019-01-29 06:16:51
回答 1查看 52关注 0票数 2

需要从字符串中获取两个子字符串。这两个子字符串由多个字符分隔,包括特殊字符,如冒号和美元符号等,这两个子字符串各有其特定的模式。

背景:

有3条字符串显示运动项目及其最终结果,如果存在的话。在每一个字符串中,运动项目的名称及其结果由不相关的字符分隔。需要提取事件的名称及其结果(如果存在)。如果事件没有结果,则不会提取任何内容。

以下3个字符串是示例:

代码语言:javascript
运行
复制
String[0] = 'Boys 10&U Event 1 2.32WBC aRc$-MW 9O%Abd, dL 2.3SV Dd$-MW 10Tzos, edResult, Final 93.1AB-ED Boys 13&O Event 1 e&12d &12C, Ac&c AcResult, Final 1.5ED-cA'

String[0],需要

[('Boys 10&U Event 1', 'Result, Final 93.1'), ('Boys 13&O Event 1', 'Result, Final 1.5')]

代码语言:javascript
运行
复制
String[1] =  'Boys 7&U Event 2 2.3B Rd$-ac %d, a 2@Ac Dd$-MW '

String[1]中,没有任何要提取的内容,因为事件没有结果。

代码语言:javascript
运行
复制
String[2] = 'Boys 7&U Event 2 c3$ 13_E Boys 10&U Event 3 2.32WBC aRc$-MW 9O%Abd, dL 2.3SV Dd$-MW 10Tzos, edResult, Final 1.23AB-ED'

String[2],需要

('Boys 10&U Event 3', 'Result, Final 1.23') and totally ignore 'Boys 7&U Event 2'.

我使用下面的代码来处理上面的3个字符串,并使用s = String[0], String[1], String[2].

代码语言:javascript
运行
复制
re.findall(r'(Boys \d+&\[A-Z]\s\Event\s\d*).*?(Result, Final\s\d*\.\d{2})[A-Z]*', s)

该代码在String[0]String[1]上运行良好,但不适用于String[2],因为它提取了第一个体育赛事的名称和第二个体育赛事的结果。

有人能帮我创建一个代码来提取每个字符串中体育赛事的名称和结果吗?如果体育赛事没有相应的结果,则代码需要忽略此事件。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-29 06:28:19

当前正则表达式存在问题,甚至无法与任何字符串匹配。例如,在regex Final\s\d*\.\d{2}中,您编写了\d{2},但是在第一个示例中,您在预期结果中只有一个数字,Final 93.1Final 1.5,因为第一个字符串不匹配。

这里是您需要用于获取所需匹配的正则表达式,

代码语言:javascript
运行
复制
(Boys\s+\S+\s+Event\s\d+)(?:(?!Boys).)*?(Result, Final\s\d*\.\d+)

Regex解释:

  • (Boys -开始捕获组,然后匹配Boys字面意思
  • \s+\S+\s+ -匹配至少一个空白,然后至少匹配一个非空白,然后至少匹配一个空白。
  • Event\s\d+) -匹配Event,然后匹配空格,然后匹配一个或多个数字
  • (?:(?!Boys).)*? -这部分匹配任何字符零或更多字符,但Boys除外,因为它选择与结束字符串最近的Boys字符串。
  • (Result, Final\s\d*\.\d+) -启动第二个捕获组,然后逐字匹配Result, Final,然后是空格,然后是十进制数,其中整数部分是可选的。

演示

Python代码示例,

代码语言:javascript
运行
复制
import re

arr = ['Boys 10&U Event 1 2.32WBC aRc$-MW 9O%Abd, dL 2.3SV Dd$-MW 10Tzos, edResult, Final 93.1AB-ED Boys 13&O Event 1 e&12d &12C, Ac&c AcResult, Final 1.5ED-cA', 'Boys 7&U Event 2 2.3B Rd$-ac %d, a 2@Ac Dd$-MW ','Boys 7&U Event 2 c3$ 13_E Boys 10&U Event 3 2.32WBC aRc$-MW 9O%Abd, dL 2.3SV Dd$-MW 10Tzos, edResult, Final 1.23AB-ED']

for s in arr:
 print(re.findall(r'(Boys\s+\S+\s+Event\s\d+)(?:(?!Boys).)*?(Result, Final\s\d*\.\d+)',s))

指纹,

代码语言:javascript
运行
复制
[('Boys 10&U Event 1', 'Result, Final 93.1'), ('Boys 13&O Event 1', 'Result, Final 1.5')]
[]
[('Boys 10&U Event 3', 'Result, Final 1.23')]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54414927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档