匹配正则表达式或未找到时保留空字符串

2024-10-01 00:23:51 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我在这个网站上的第一篇帖子,所以如果我搞砸了,告诉我。我需要为同名文件找到配置文件,不同的是配置文件的末尾有str。 some characters + _digit + car + some more characters + str or nothing. 所有文件都是文本形式,因此扩展名不提供任何更多信息。文件名中还包含一些重要的信息,如出现次数,我也需要提取这些信息。你知道吗

我使用regex的方法可以归结为

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', '')]

我知道我不使用?我试着四处看看,但不知道我错过了什么。我还想坚持使用正则表达式方法进行练习。你知道吗


Tags: 文件方法re信息config配置文件somereg
1条回答
网友
1楼 · 发布于 2024-10-01 00:23:51

regex失败的主要原因是.*之前的(str)?将整个字符串抓取到底,而(str)?只是匹配字符串结尾的位置,因为它不必使用任何字符(因为它是可选的)。你知道吗

但是,由于过度使用lookarounds,regex可以得到极大的优化。使用

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子串。你知道吗

相关问题 更多 >