我正在尝试对文件夹中的某些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之后逗号的语法无效。
我尝试了从其他问题中搜索的许多组合,但似乎对我不起作用,有人可以提供建议吗?谢谢
答案 0 :(得分:1)
您正试图将game_id
传递给re.search
方法,而不是传递给r'(%s+_\d{4}-\d{2}-\d{2}\.csv$'
字符串文字,这会造成麻烦。
然后,您有一个不匹配的开头,但没有圆括号,而没有圆括号,这将导致正则表达式错误。
此外,+
之后的%s
可能会导致意外的比赛:100
,1000
和1000000
的游戏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
和字符串的结尾。