【问题标题】:Split string from two pattern based on regex Python基于正则表达式 Python 从两个模式中拆分字符串
【发布时间】:2023-04-10 05:56:01
【问题描述】:

给定两个文件路径

Z:\home\user\dfolder\NO,AG,GK.jpg
Z:\home\user\dfolder\NI,DG,BJ (1).jpg

目标是将每个字符串拆分并存储到一个字典中

目前,我首先使用os.path.split 拆分路径以获取 s 列表

s=['NO,AG,GK.jpg','NI,DG,BJ (1).jpg']

并迭代分割字符串如下

all_dic=[]
for ds in s:
  k=ds.split(",")
  kk=k[-1].split('.jpg')[0].split("(")[0] if bool(re.search('\(\d+\)', ds)) else k[-1].split('.jpg')[0]
  nval={"f":k[0],"s":k[1],"t":kk}
  all_dic.append(nval)

但是,我很好奇 regex 方法,或任何 1 班轮。

【问题讨论】:

  • 什么是正则表达式问题?
  • 恕我直言,pathlib,在这种情况下,是比正则表达式更好(并且更 Pythonic)的选项。

标签: python regex


【解决方案1】:

使用正则表达式+内联列表解析的一个线性解析:

import re

s = ['NO,AG,GK.jpg', 'NI,DG,BJ (1).jpg']

keys = ['f', 's', 't']
all_dic = [{keys[k]: x for k, x in enumerate(
    re.sub("(\s\(\d+\))?(\.jpg)?", "", item).split(','))} for item in s]

print(all_dic)

->

[{'f': 'NO', 's': 'AG', 't': 'GK'}, {'f': 'NI', 's': 'DG', 't': 'BJ'}]

【讨论】:

  • 嗨,Gab,如果您修改“NI,DG,BJ(1).jpg”等案例,我们将不胜感激。您当前的建议产生 ''NI,DG,BJ(1)'
  • 如果你的预期输出NI,DG,BJ(1).jpg?
  • 感谢@gab 的回复。预期的输出应该是 NI,DG,BJ
  • 上面的例子返回[{'f': 'NO', 's': 'AG', 't': 'GK'}, {'f': 'NI', 's': 'DG', 't': 'BJ'}],它没有BJ(1)
【解决方案2】:

嗯,我认为这是在不使用 split() 函数的情况下获得相同输出的最简单方法。

正则表达式只接受字母并将它们放在一个列表中,因此我们甚至不必拆分字符串或从中删除 (1)。

import re

s=['NO,AG,GK.jpg','NI,DG,BJ (1).jpg']
all_dic = []

for ds in s:
    regex = '[a-zA-Z]+'
    k = re.findall(regex,ds)            # We extract all the matches (as a list)

    nval={'f':k[0],'s':k[1],'t':k[2]}   # We create the dictionary
    all_dic.append(nval)                # We append the dictionary to the list
        
print(all_dic)
# Output: [{'f': 'NO', 's': 'AG', 't': 'GK'}, {'f': 'NI', 's': 'DG', 't': 'BJ'}]

另外,您的文件扩展名为k[3],以备不时之需。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-25
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多