繁体   English   中英

正则表达式:模式无法匹配我正在寻找的内容

[英]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

有几件事正在发生:

  1. 您需要使用与模式相同的r'string'符号来声明字符串定义; 现在你的string只有一个反斜杠,因为两个中的第一个被转义了。
  2. 我不确定您是否正确使用* 它的意思是“重复紧接在前面的组”,而不仅仅是“任何字符串”(例如,在通常的 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM