繁体   English   中英

python 正则表达式从列表中仅提取特定的模式文件名

[英]python regex to extract only specific pattern file names from a list

我只想从列表中提取某些文件。 我需要在仅从列表中提取选定文件时应用以下规则。

如果文件包含f[1-99]t[1-99]v[1-99]f[1-9]_v[1-9]_t[1-9]的组合。 下面是一些示例。

phone_football_androind_1_v1_te_t1_fe
phone_football_ios_v1_t1
foot_cricket2345678_f12_t4
tfd_fr_ve_t1_v1_f3_201234_yyymmmdd
def_000_t4_f1
file_job_1234567_f1_t55
ROKLOP_f33_t44
agdcv_t45
gop_gop_f1_t14_v14
file_op_v1_t1
fop_f1_v1_1223

你能帮忙检查一下上面的模式是否包含在文件中,并且只获取具有以下模式的文件吗? 我试过跟随但坚持使用 python 中的 reges。 不确定如何在正则表达式中添加 OR 条件

import re

# Take input from users
MyString1 = "tfd_fr_ve_t1_v1_f3_201234_yyymmmdd"

# re.search() returns a Match object
# if there is a match anywhere in the string
if re.search('(_v(\d+)).*', MyString1):
    print("YES,it is present in string ")
else:
    print("NO,string is not present")

要检查是否存在匹配项:

_[ftv][1-9]\d?(?!\d)

解释

  • _字面匹配
  • [ftv]匹配其中一个f t v
  • [1-9]\d? 匹配数字 1- 99
  • (?!\d)断言右边不是数字

正则表达式演示| Python演示

示例代码

import re

strings = [
    "tfd_fr_ve_t1_v1_f3_201234_yyymmmdd",
    "phone_football_androind_1_v1_te_t1_fe",
    "phone_football_ios_v1_t1",
    "foot_cricket2345678_f12_t4",
    "tfd_fr_ve_t1_v1_f3_201234_yyymmmdd",
    "def_000_t4_f1",
    "file_job_1234567_f1_t55",
    "ROKLOP_f33_t44",
    "agdcv_t45",
    "gop_gop_f1_t14_v14",
    "file_op_v1_t1",
    "fop_f1_v1_1223",
    "test"
]
pattern = r"_[ftv][1-9]\d?(?!\d)"
for s in strings:
    if re.search(pattern, s):
        print(f"YES, present in '{s}' ")
    else:
        print(f"NO, not present in '{s}'")

输出

YES, present in 'tfd_fr_ve_t1_v1_f3_201234_yyymmmdd' 
YES, present in 'phone_football_androind_1_v1_te_t1_fe' 
YES, present in 'phone_football_ios_v1_t1' 
YES, present in 'foot_cricket2345678_f12_t4' 
YES, present in 'tfd_fr_ve_t1_v1_f3_201234_yyymmmdd' 
YES, present in 'def_000_t4_f1' 
YES, present in 'file_job_1234567_f1_t55' 
YES, present in 'ROKLOP_f33_t44' 
YES, present in 'agdcv_t45' 
YES, present in 'gop_gop_f1_t14_v14' 
YES, present in 'file_op_v1_t1' 
YES, present in 'fop_f1_v1_1223' 
NO, not present in 'test'

我认为这个小正则表达式可以匹配您的所有结果:

'(f|t|v)[1-9]{1,2}'

下面是显示匹配结果的一小段代码:

>>> files = ['phone_football_androind_1_v1_te_t1_fe', 'phone_football_ios_v1_t1', 'foot_cricket2345678_f12_t4', 'tfd_fr_ve_t1_v1_f3_201234_yyymmmdd', 'def_000_t4_f1', 'file_job_1234567_f1_t55', 'ROKLOP_f33_t44', 'agdcv_t45', 'gop_gop_f1_t14_v14', 'file_op_v1_t1', 'fop_f1_v1_1223']
>>> regex = '(f|t|v)[1-9]{1,2}'
>>> for file in files:
...     if re.search(regex, file):
...         print(f"match: {file}")
...
match: phone_football_androind_1_v1_te_t1_fe
match: phone_football_ios_v1_t1
match: foot_cricket2345678_f12_t4
match: tfd_fr_ve_t1_v1_f3_201234_yyymmmdd
match: def_000_t4_f1
match: file_job_1234567_f1_t55
match: ROKLOP_f33_t44
match: agdcv_t45
match: gop_gop_f1_t14_v14
match: file_op_v1_t1
match: fop_f1_v1_1223

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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