这是我在该网站上的第一篇文章,所以请告诉我是否搞砸了。我需要找到同名文件的配置文件,区别在于配置文件的末尾带有“ 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', '')]
我知道我不使用吗?令牌正确,我尝试环顾四周,但我不知道自己在想什么。我也想坚持使用正则表达式方法进行练习。
答案 0 :(得分:0)
您的正则表达式失败的主要原因是.*
之前的(str)?
抓取了整个字符串的末尾,而(str)?
仅匹配字符串末尾的位置,因为它不必消耗任何字符(因为它是可选的)。
但是,当您过度使用环顾四周时,可以极大地优化您的正则表达式。使用
reg = r'(.*?)(\d)car(?:.*(str))?'
或
reg = r'(.*?)(\d+)car(?:.*(str))?'
请参见this Python demo和regex demo。
详细信息
(.*?)
-组1:除换行符以外的任何0+个字符,应尽可能少(\d+)
-第2组:一个或多个数字car
-一个car
字符串(?:.*(str))?
-与1个或0个匹配项匹配的可选非捕获组
.*
-尽可能多的0+字符(换行符除外)(str)
-第3组:str
子字符串。