Python Can';t用变量替换字符串
我想出了下面的方法,在一行中找到一个字符串,并将该行复制到一个新文件中。我想用更动态的东西(例如[0-9],等等)来替换Python Can';t用变量替换字符串,python,regex,variables,Python,Regex,Variables,我想出了下面的方法,在一行中找到一个字符串,并将该行复制到一个新文件中。我想用更动态的东西(例如[0-9],等等)来替换Foo23,但我无法让它、变量或正则表达式工作。它没有失败,但我也没有得到任何结果。帮忙?谢谢 with open('C:/path/to/file/input.csv') as f: with open('C:/path/to/file/output.csv', "w") as f1: for line in f: if "Fo
Foo23
,但我无法让它、变量或正则表达式工作。它没有失败,但我也没有得到任何结果。帮忙?谢谢
with open('C:/path/to/file/input.csv') as f:
with open('C:/path/to/file/output.csv', "w") as f1:
for line in f:
if "Foo23" in line:
f1.write(line)
根据您的评论,您希望在出现任何三个字母后跟两个数字时匹配行,例如
foo12
和bar54
。使用正则表达式
import re
pattern = r'([a-zA-Z]{3}\d{2})\b'
for line in f:
if re.findall(pattern, line):
f1.write(line)
这将匹配像'some line foo12'
和'other foo54 line'
这样的行,但不匹配'a third line foo'
或'something bar 123'
细分:
pattern = r'( # start capture group, not needed here, but nice if you want the actual match back
[a-zA-Z]{3} # any three letters in a row, any case
\d{2} # any two digits
) # end capture group
\b # any word break (white space or end of line)
'
如果您真正需要的是将文件中的所有匹配项写入f1
,则可以使用:
matches = re.findall(pattern, f.read()) # finds all matches in f
f1.write('\n'.join(matches)) # writes each match to a new line in f1
根据您的评论,您希望在出现任何三个字母后跟两个数字时匹配行,例如
foo12
和bar54
。使用正则表达式
import re
pattern = r'([a-zA-Z]{3}\d{2})\b'
for line in f:
if re.findall(pattern, line):
f1.write(line)
这将匹配像'some line foo12'
和'other foo54 line'
这样的行,但不匹配'a third line foo'
或'something bar 123'
细分:
pattern = r'( # start capture group, not needed here, but nice if you want the actual match back
[a-zA-Z]{3} # any three letters in a row, any case
\d{2} # any two digits
) # end capture group
\b # any word break (white space or end of line)
'
如果您真正需要的是将文件中的所有匹配项写入f1
,则可以使用:
matches = re.findall(pattern, f.read()) # finds all matches in f
f1.write('\n'.join(matches)) # writes each match to a new line in f1
本质上,您的问题归结为:“我想确定字符串是否与模式X匹配,如果匹配,则将其输出到文件”。实现这一点的最佳方法是使用reg-ex。在Python中,标准的reg-ex库是
re
。所以
import re
matches = re.findall(r'([a-zA-Z]{3}\d{2})', line)
结合文件IO操作,我们有:
data = []
with open('C:/path/to/file/input.csv', 'r') as f:
data = list(f)
data = [ x for x in data if re.findall(r'([a-zA-Z]{3}\d{2})\b', line) ]
with open('C:/path/to/file/output.csv', 'w') as f1:
for line in data:
f1.write(line)
请注意,我分割了文件IO操作以减少嵌套。我还删除了IO外部的过滤。一般来说,为了便于测试和维护,代码的每一部分都应该做“一件事”。本质上,您的问题归结为:“我想确定字符串是否与模式X匹配,如果匹配,则将其输出到文件”。实现这一点的最佳方法是使用reg-ex。在Python中,标准的reg-ex库是
re
。所以
import re
matches = re.findall(r'([a-zA-Z]{3}\d{2})', line)
结合文件IO操作,我们有:
data = []
with open('C:/path/to/file/input.csv', 'r') as f:
data = list(f)
data = [ x for x in data if re.findall(r'([a-zA-Z]{3}\d{2})\b', line) ]
with open('C:/path/to/file/output.csv', 'w') as f1:
for line in data:
f1.write(line)
请注意,我分割了文件IO操作以减少嵌套。我还删除了IO外部的过滤。一般来说,代码的每一部分都应该做“一件事”,以便于测试和维护。您试图编写的动态内容是什么?正如代码所示,您正在测试该行是否有“Foo23”,如果有则打印它。所有其他行都将被忽略。@malan在正则表达式下,我要搜索的是任何包含
r“[A-Za-z][A-Za-z][A-Za-z]\d\d”
…的行,但我无法使其或变量或正则表达式起作用。
-请阅读。向我们展示您尝试执行的不起作用的操作-包括一个示例输入字符串。@physlexic:您不知道要使用什么模块和命令来搜索r“[A-Za-z][A-Za-z][A-Za-z]\d\d”
尝试导入re
,然后测试如果re.search(r“[A-Za-z][A-Za-z][A-Za-z]\d\d”,第行):
@malan抱歉,也许我应该解释得更好,但在我最初的问题中,我所说的或regex
,是指我确实尝试了导入re
等。等等。你想写的动态东西是什么?正如代码所示,您正在测试该行是否有“Foo23”,如果有则打印它。所有其他行都将被忽略。@malan在正则表达式下,我要搜索的是任何包含r“[A-Za-z][A-Za-z][A-Za-z]\d\d”
…的行,但我无法使其或变量或正则表达式起作用。
-请阅读。向我们展示您尝试执行的不起作用的操作-包括一个示例输入字符串。@physlexic:您不知道要使用什么模块和命令来搜索r“[A-Za-z][A-Za-z][A-Za-z]\d\d”
尝试导入re
,然后测试如果re.search(r“[A-Za-z][A-Za-z][A-Za-z]\d\d”,第行):
@malan抱歉,也许我应该解释得更好,但在我最初的问题中,我所说的或regex
是指我确实尝试了导入re
等。这种模式不需要f字符串。\w{3}
将匹配的不仅仅是3个字母。为什么有变量我的字符串
,这不是我的错used@DillonDavis从以前版本的答案,我改变了。现在删除它,谢谢。@physlexic查看我的更新。如果您只想从文件中获取所有匹配项,那么就更容易了!此模式不需要f字符串。\w{3}
将匹配的不仅仅是3个字母。为什么有变量my\u string
,它不是used@DillonDavis从以前版本的答案,我改变了。现在删除它,谢谢。@physlexic查看我的更新。如果您只想从文件中获取所有匹配项,那么就更容易了!