是否有任何正则表达式用于从文本中查找和提取字符串

Posted

技术标签:

【中文标题】是否有任何正则表达式用于从文本中查找和提取字符串【英文标题】:Is there any regular expression for finding and extract the string from a text 【发布时间】:2021-08-06 09:45:03 【问题描述】:

我有一个存储在文本文件中的路径列表。我正在尝试使用正则表达式从该文本中提取完整路径。

文本文件数据

/IVTP/DB_db/0171-0_7-296&519_510&586-501&586_296&585_305&519_510&520-0_9_25_31_33_33_32-205-35.jpg 
/IVTP/DB_db/0069-0_2-450&447_581&491-579&491_450&490_452&447_581&448-0_0_9_29_17_24_30-209-15.jpg 
/IVTP/DB_base/0395-4_7-175&502_475&612-456&612_175&590_194&502_475&524-10_0_9_14_26_27_27-206-22.jpg 
/IVTP/DB_base/0234-7_21-271&499_461&602-461&602_291&580_271&499_441&521-0_0_1_32_31_31_18-215-37.jpg 
/IVTP/DB_cc/0291-0_7-271&483_527&578-517&574_271&578_281&487_527&483-0_0_20_29_33_26_18-212-93.jpg 
/IVTP/DB_cc/0325-1_6-227&475_507&572-499&565_227&572_235&482_507&475-0_0_23_28_33_25_33-212-30.jpg

我将文件读取为文本

imgs_abs_path = [line.strip() for line in open('/home/img_data.txt', 'r') if line.strip() != '']
#converting the list to string 
imgs_paths_to_str = ",".join(str(x) for x in imgs_data_abs_path)
# lis the images from the dataset
imgs_data = [f for f in os.listdir('.') if f.endswith('.jpg')]

我的问题

读取每张图片后,我想使用正则表达式检查名称是否存在于文本文件中。如果是,那么我想从文本文件中提取绝对路径。

我使用了这个正则表达式,但它总是返回空 "(/IVTP/*"+img+")"

我的代码

new_list = []
for img in imgs_data:
   if search(img, imgs_paths_to_str):
       regex = "(/IVTP/*"+img+")"
       new_list.append(re.findall(regex, imgs_paths_to_str))

print(print(new_list))
[]

【问题讨论】:

with open('/home/img_data.txt', 'r') as f: print(re.findall(r'^/IVTP/.*\.jpg$', f.read(), re.M))?如果你只想提取所有以/IVTP/ 开头并以.jpg 结尾的行,这应该足够了。 Wiktor 给了你一个很好的解决方案,但是如果你想获取名称或路径,你可以使用组这个表达式可能对你有用(\/IVTP\/(.*?\/)(.*)$) @WiktorStribiżew print(re.findall(r'^/IVTP/.*\.jpg$' 返回所有匹配但我想要所有匹配的文件名 r'^/VTP/.' +img.split('.')[0]+ '*\.jpg$' 给我 [] 尝试打印你在正则表达式执行行中得到了什么,也许你能注意到哪里出了问题 试试ideone.com/7u4uy3 【参考方案1】:

我建议将文本文件中的路径添加到imgs_paths_to_strlist,而不是字符串,然后再次检查在当前目录中找到的文件,只保留那些以你开头的文件必需的前缀并以在目录中找到的文件名结尾:

imgs_paths_to_str = []

with open('/home/img_data.txt', 'r') as f:
    for line in f:
        line = line.strip()
        if line:
            imgs_paths_to_str.append(line)

imgs_data = [f for f in os.listdir('.') if f.endswith('.jpg')]

new_list = []
for img in imgs_data:
    for ipts in imgs_paths_to_str:
        if ipts.startswith('/IVTP/') and ipts.endswith(img):
            print(ipts) # new_list.append(ipts)

请参阅Python demo。

【讨论】:

以上是关于是否有任何正则表达式用于从文本中查找和提取字符串的主要内容,如果未能解决你的问题,请参考以下文章

使用正则表达式从 C# 中的 SQL 语句中查找 SQL 函数

re库和正则表达式

从 HTML 中提取文本的正则表达式

正则表达式 学习笔记

python 正则表达式

Python基础 :正则表达式