Python正则表达式:获取除一些后面跟着特定术语的数字之外的所有数字



目标是从文本中获取除后面跟有特定单词/字符(包括忽略日期(的数字之外的所有数字。我正在努力解决的是背后的负面影响

例如: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+-单词边界,然后是charBwordA,零个或多个空格,零位或多个数字,一个可选的点或逗号,一个或多位数字
  • |-或(下一部分被捕获,re.findall将只输出结果列表中的部分,以上部分将被丢弃(
  • (?<!d[.,])(?<!d)(d*[.,]?d+)(?!s*(?:wordB|charA)|[.,]?d)-不允许任何数字或数字和.,立即出现在左侧,则零个或多个数字、可选的.,和一个或多个子数字被捕获到组1中,然后,如果存在wordBcharA或可选的.,,并且数字立即出现在任何零个或更多空白之后的右侧,则负前瞻不匹配

请参阅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']

相关内容

最新更新