匹配正则表达式或找不到空字符串

时间:2019-08-23 12:12:18

标签: python regex

这是我在该网站上的第一篇文章,所以请告诉我是否搞砸了。我需要找到同名文件的配置文件,区别在于配置文件的末尾带有“ str”。 some characters + _digit + car + some more characters + str or nothing. 所有文件均为文本格式,因此扩展名不再提供更多信息。文件名中还包含一些重要信息,例如出现次数,我也需要提取这些信息。

我使用正则表达式的方法可以归结为这个

import re

reg = '(.*(?=\\dcar))(\\d(?=car)).*(str)?'      

config_to_file1 = 'wts-lg-000191_0car_lp_str'
file1 = 'wts-lg-000191_0car_lp'

print(re.findall(reg,file1))
print(re.findall(reg,config_to_file1))

我也尝试过

reg = '(.*(?=\\dcar))(\\d(?=car)).*(str)+'

我希望得到这个:

[('wts-lg-000191_', '0', 'str')]
[('wts-lg-000191_', '0', '')]

但是得到这个:

[('wts-lg-000191_', '0', '')]
[('wts-lg-000191_', '0', '')]

我知道我不使用吗?令牌正确,我尝试环顾四周,但我不知道自己在想什么。我也想坚持使用正则表达式方法进行练习。

1 个答案:

答案 0 :(得分:0)

您的正则表达式失败的主要原因是.*之前的(str)?抓取了整个字符串的末尾,而(str)?仅匹配字符串末尾的位置,因为它不必消耗任何字符(因为它是可选的)。

但是,当您过度使用环顾四周时,可以极大地优化您的正则表达式。使用

reg = r'(.*?)(\d)car(?:.*(str))?'

reg = r'(.*?)(\d+)car(?:.*(str))?'

请参见this Python demoregex demo

详细信息

  • (.*?)-组1:除换行符以外的任何0+个字符,应尽可能少
  • (\d+)-第2组:一个或多个数字
  • car-一个car字符串
  • (?:.*(str))?-与1个或0个匹配项匹配的可选非捕获组
    • .*-尽可能多的0+字符(换行符除外)
    • (str)-第3组:str子字符串。