[英]What am I doing wrong with this Python regex that is supposed to match repeats of a pattern, followed by an optional pattern?
[英]regex: pattern fails to match what I am looking for
我有以下代码尝试从基于双 \\ 字符的目录中检索文件名:
import re
string = 'I:/Etrmtest/PZMALIo4/ETRM841_FX_Deals_Restructuring/FO_PRE\\abo_st_gas_dtd.csv'
pattern = r'(?<=*\\\\)*'
re.findall(pattern,string)
背后的原因是文件名总是在双 \\ 之后,所以我尝试查看以 \\ 结尾的任何文本前面的任何字符串。
尽管如此,当我应用此代码时,出现以下错误:
error: nothing to repeat at position 4
我究竟做错了什么?
编辑:我正在寻找的具体输出是将字符串'abo_st_gas_dtd_csv'
作为匹配项。
你的模式只是一个回顾,它本身无法匹配任何东西。 我会使用这种re.findall
方法:
string = 'I:/Etrmtest/PZMALIo4/ETRM841_FX_Deals_Restructuring/FO_PRE\\abo_st_gas_dtd.csv'
filename = re.findall(r'\\([^.]+\.\w+)$', string)[0]
print(filename) # abo_st_gas_dtd.csv
有几件事正在发生:
r'string'
符号来声明字符串定义; 现在你的string
只有一个反斜杠,因为两个中的第一个被转义了。*
。 它的意思是“重复紧接在前面的组”,而不仅仅是“任何字符串”(例如,在通常的 shell 模式中)。 括号中的第一个*
前面没有任何内容,这意味着正则表达式无效。 因此,您看到的错误。 我认为,您想要的是.*
,即重复任何字符 0 次或更多次。 此外,括号中不需要它。 更正确的正则表达式是r'(?<=\\\\\\\\).*'
:import re
string = r'I:/Etrmtest/PZMALIo4/ETRM841_FX_Deals_Restructuring/FO_PRE\\abo_st_gas_dtd.csv'
pattern = r'(?<=\\\\).*'
re.findall(pattern,string)
files = 'I:E\\trm.csvest/PZMALIo4\ETRM841_FX_.csvDeals_Restructuring/FO_PRE\\abo_st_gas_dtd.csv'
counter = -1
my_files = []
for f in files:
counter += 1
if ord(f) == 92:#'\'
temp = files[counter+1:len(files)]
temp_file = ""
for f1 in temp:
temp_file += f1
# [0-len(temp_file)] => if [char after . to num index of type file]== csv
if f1 == '.' and temp[len(temp_file):len(temp_file)+3] == "csv":
my_files.append(temp_file + "csv")
break
print(my_files)#['trm.csv', 'ETRM841_FX_.csv', 'abo_st_gas_dtd.csv']
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.