不匹配正则表达式中的一定数量的字符

问题描述 投票:3回答:2

我有以下表达式

diff_pr_EUR-44_cordex_rcp45_mon_ave_2048-2060_minus_2005-2017_mon10_ave1_withsd.nc

我想使用regex来提取并生成以下字符串

rcp45_mon10

到目前为止,我已尝试使用在线regex tester

rcp\d\d[^.]+mon\d+

哪个提取超过我需要的...

rcp45_mon_ave_2048-2060_minus_2005-2017_mon10

如何让正则表达式跳过后续字符,直到它到达mon10部分?

谢谢

python regex string
2个回答
2
投票

你可以在这里使用re.sub

>>> s = 'diff_pr_EUR-44_cordex_rcp45_mon_ave_2048-2060_minus_2005-2017_mon10_ave1_withsd.nc'
>>> print (re.sub(r'^.*?(rcp\d+).*(_mon\d+).*', r'\1\2', s))
rcp45_mon10

RegEx Demo

细节:

  • ^.*?:匹配0或开头的任何字符(懒惰)
  • (rcp\d+):匹配并捕获rcp,然后是#1组中的1+位数
  • .*:匹配0或任何字符(贪婪)
  • (_mon\d+):在第2组中匹配并捕获_mon,然后是1+位数
  • .*:匹配任何东西直到最后
  • r'\1\2':通过组#1和组#2的反向引用替换字符串

2
投票

您可以使用两个匹配的组匹配,join

>>> ''.join(re.findall(r'(rcp\d{2}).*?(\_mon\d{2})', s)[0])
'rcp45_mon10'
© www.soinside.com 2019 - 2024. All rights reserved.