需要从字符串中获取两个子字符串。这两个子字符串由多个字符分隔,包括特殊字符,如冒号和美元符号等,这两个子字符串各有其特定的模式。
背景:
有3条字符串显示运动项目及其最终结果,如果存在的话。在每一个字符串中,运动项目的名称及其结果由不相关的字符分隔。需要提取事件的名称及其结果(如果存在)。如果事件没有结果,则不会提取任何内容。
以下3个字符串是示例:
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')]
String[1] = 'Boys 7&U Event 2 2.3B Rd$-ac %d, a 2@Ac Dd$-MW '
在String[1]
中,没有任何要提取的内容,因为事件没有结果。
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].
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]
,因为它提取了第一个体育赛事的名称和第二个体育赛事的结果。
有人能帮我创建一个代码来提取每个字符串中体育赛事的名称和结果吗?如果体育赛事没有相应的结果,则代码需要忽略此事件。
谢谢!
发布于 2019-01-29 06:28:19
当前正则表达式存在问题,甚至无法与任何字符串匹配。例如,在regex Final\s\d*\.\d{2}
中,您编写了\d{2}
,但是在第一个示例中,您在预期结果中只有一个数字,Final 93.1
和Final 1.5
,因为第一个字符串不匹配。
这里是您需要用于获取所需匹配的正则表达式,
(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代码示例,
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))
指纹,
[('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')]
https://stackoverflow.com/questions/54414927
复制相似问题