目标是从文本中获取除后面跟有特定单词/字符(包括忽略日期(的数字之外的所有数字。我正在努力解决的是背后的负面影响
例如:4.5$55 1200单词A 3 sometext 2单词B sometext 4.3 charA sometext charB21.6 sometext 11/10/22
在样本编号3、2、4.3、21.6和日期11/10/22中,将被忽略
我的尝试https://regex101.com/r/PQvtOl/1/
(d*b[.,]?d+)(?!d*? (?:wordB))(?!d*?(?:charA))((?!b[charB/])(?!d+))
如有任何帮助,我们将不胜感激!
您可以使用
(?<!d)d{1,2}/d{1,2}/d{2}(?:d{2})?(?!d)|b(?:charB|wordA)s*d*[.,]?d+|(?<!d[.,])(?<!d)(d*[.,]?d+)(?!s*(?:wordB|charA)|[.,]?d)
只获取捕获组#1中捕获的匹配项。请参阅regex演示详细信息:
(?<!d)d{1,2}/d{1,2}/d{2}(?:d{2})?(?!d)|
-一个类似日期的字符串:左边不允许有数字,然后是一到两位,/
,一到两位数,/
,然后是两到四位,右边不允许有额外数字,或者b(?:charB|wordA)s*d*[.,]?d+
-单词边界,然后是charB
或wordA
,零个或多个空格,零位或多个数字,一个可选的点或逗号,一个或多位数字|
-或(下一部分被捕获,re.findall
将只输出结果列表中的部分,以上部分将被丢弃((?<!d[.,])(?<!d)(d*[.,]?d+)(?!s*(?:wordB|charA)|[.,]?d)
-不允许任何数字或数字和.
或,
立即出现在左侧,则零个或多个数字、可选的.
或,
和一个或多个子数字被捕获到组1中,然后,如果存在wordB
、charA
或可选的.
或,
,并且数字立即出现在任何零个或更多空白之后的右侧,则负前瞻不匹配
请参阅Python演示:
import re
text = '4.5 $55 1,200 wordA 3 sometext 2 wordB sometext 4.3charA sometext charB21.6 sometext 11/10/22'
rx = r'(?<!d)d{1,2}/d{1,2}/d{2}(?:d{2})?(?!d)|b(?:charB|wordA)s*d*[.,]?d+|(?<!d[.,])(?<!d)(d*[.,]?d+)(?!s*(?:wordB|charA)|[.,]?d)'
matches = re.findall(rx, text)
print( [ m for m in matches if m ] )
# => ['4.5', '55', '1,200']