在Python中使用列表中的值作为正则表达式中的变量

时间:2018-11-27 05:44:03

标签: python regex python-3.x

我正在尝试对文件夹中的某些csv文件执行一些操作,所有这些文件都应具有相同的格式,但ID除外;它看起来像:Myfile_100_2018-11-26.csv,所有这些数字都不同(100表示id,其余数字为日期时间); 我有一个列表对象,其中包含我要打开的所有ID,例如my_id = [100,200,300,400]

import pandas as pd
import os
import re

allfiles = os.listdir('.')
game_id=[100,200,300,400]
from id in game_id:
     files = [f for f in allfiles if re.search(r'(%s+_\d{4}-\d{2}-\d{2}\.csv$')%game_id, f)]

在我的代码中,我想用game_id代替%s,这样我就可以循环遍历ID为100、200、300,400的所有文件;但是我收到一个错误:SyntaxError:game_id之后逗号的语法无效。

我尝试了从其他问题中搜索的许多组合,但似乎对我不起作用,有人可以提供建议吗?谢谢

1 个答案:

答案 0 :(得分:1)

您正试图将game_id传递给re.search方法,而不是传递给r'(%s+_\d{4}-\d{2}-\d{2}\.csv$'字符串文字,这会造成麻烦。

然后,您有一个不匹配的开头,但没有圆括号,而没有圆括号,这将导致正则表达式错误。

此外,+之后的%s可能会导致意外的比赛:10010001000000的游戏ID可能会返回。

您可以使用

import re
allfiles=['YES_100_1234-22-33.csv', 'NO_1000_1023-22-33.csv', 'no_abc.csv']
game_id=[100,200,300,400]
rx=re.compile(r'(?<!\d)(?:%s)_\d{4}-\d{2}-\d{2}\.csv$'%"|".join(map(str,game_id)))
# => (?<!\d)(?:100|200|300|400)_\d{4}-\d{2}-\d{2}\.csv$
files = [f for f in allfiles if rx.search(f)]
print(files) # => ['YES_100_1234-22-33.csv']

正则表达式的形成方式

rx=re.compile(r'(?<!\d)(?:%s)_\d{4}-\d{2}-\d{2}\.csv$'%"|".join(map(str,game_id)))
# => (?<!\d)(?:100|200|300|400)_\d{4}-\d{2}-\d{2}\.csv$

请参见regex demo

详细信息

  • (?<!\d)-下一个字符匹配前没有数字
  • (?:100|200|300|400)-game_id个值与交替运算符结合在一起
  • _\d{4}-\d{2}-\d{2}-_,4位数字,-,2位数字,-,2位数字
  • \.csv$-.csv和字符串的结尾。