获取文本和百分比的一种方法是,正则表达式python将数字与论文中的字母区分开来

获取文本和百分比的一种方法是,正则表达式python将数字与论文中的字母区分开来,python,regex,Python,Regex,我有这个: Bbc World News (57%); DANONE SA (FRANCE) (52%), Mn-Public-Radio-Intl; SIC123 Industry (52%) 我想得到: [BBC World News, 57], [DANONE SA (FRANCE), 52], [Mn-Public-Radio Intl, 0], [SIC123 Industry, 52] 在Martijn Pieters的帮助下,我可以得到除达能(法国)以外的一切。我不知道如何区分

我有这个:

Bbc World News (57%); DANONE SA (FRANCE) (52%), Mn-Public-Radio-Intl; SIC123 Industry (52%)
我想得到:

[BBC World News, 57], [DANONE SA (FRANCE), 52], [Mn-Public-Radio Intl, 0], [SIC123 Industry, 52]
在Martijn Pieters的帮助下,我可以得到除达能(法国)以外的一切。我不知道如何区分(法国)和(52%)

您可以将
()
字符包含在字符类中,但它将与百分比文本的第一个字符相匹配(因此
(57
)对于
Bbc世界新闻(57%)
。要使这一切都能正常工作,您需要对尾部的
或字符串结尾进行前瞻性匹配:

re.findall(r'(\b[\w() -]+)(?:\s+\((\d+)%\))?(?=[,;]|$)', inputtext)
(?=…)
是一个前瞻性匹配;该部分现在锚定到任何位置,该位置后面跟一个与
[,;]
类匹配的字符,或者是一行的结尾。这使得前面的部分与可选的
(…%)匹配
percentage amount,仅在逗号、分号或文本结尾之前起作用,这将限制前面部分的匹配

演示:


在这里使用正则表达式越来越难了;数字是名称的一部分吗?是的,数字有时是名称的一部分如果先拆分字符串,可能会更容易,
re.split(“,|,”,s)
这真是太棒了!你太棒了!它似乎起作用了,但我需要尝试更多的案例。如果我在(?=[,;]|$)中添加一个空格,你认为会产生什么有害影响?@user3314418:试试看,但这可能会破坏锚定,因为它可能匹配太多位置。@user3314418:
的意思是或;匹配
[,;]
或match
$
$
匹配字符串的结尾。
re.findall(r'(\b[\w() -]+)(?:\s+\((\d+)%\))?(?=[,;]|$)', inputtext)
>>> import re
>>> import numpy as np
>>> inputtext = 'Bbc World News (57%); DANONE SA (FRANCE) (52%), Mn-Public-Radio-Intl; SIC123 Industry (52%)'
>>> [(name, int(perc) if perc else np.nan)
...  for name, perc in re.findall(r'(\b[\w() -]+)(?:\s+\((\d+)%\))?(?=[,;]|$)', inputtext)]
[('Bbc World News', 57), ('DANONE SA (FRANCE)', 52), ('Mn-Public-Radio-Intl', nan), ('SIC123 Industry', 52)]