2015-07-21 212 views
1

有人可以请回答吗? 我正在尝试学习reg表达式(重新)模块,并且我无法在这个模块中找到我的头。我试图想出正则表达式来捕获所有3文件名格式正则表达式python 3.4

的Python 3.4.3

>>> re.findall("file[\_-]1","file-1 file_1, file\1") 
['file-1', 'file_1'] 
>>> 

为什么没有赶上文件\ 1 ?? 我也尝试其他两种模式,没有一个工作:(

1. re.findall("file[\\_-]1","file-1 file_1, file\1") 
2. re.findall(r"file[\_-]1","file-1 file_1, file\1") 

感谢, 萨加尔

+1

反斜杠在Python字符串和正则表达式特殊的含义......看到例如https://docs.python.org/3/howto/regex.html#the-backslash-plague – jonrsharpe

+0

“file \ 1”中的'\ 1'是一个控制字符'\ u0001;'。如果你真的打算捕获它,使用'print(re.findall(“file [\ u0001 _-] 1?”,“file-1 file_1,file \ 1”))',但我怀疑你需要它。 –

回答

1

反斜线在正则表达式有意义,太; \_只是意味着一个文字下划线,或者下划线或反斜杠,而是需要r'...'(原始Python字符串)\\(正则表达式中的文字反斜杠)请注意,您尝试搜索的字符串也应该是原始文字都有了成倍的反斜杠:

>>> "file-1 file_1, file\1" 
'file-1 file_1, file\x01' # probably not what you expected... 
>>> r"file-1 file_1, file\1" 
'file-1 file_1, file\\1' 

因此,您可以:

>>> re.findall(r"file[\\_-]1", r"file-1 file_1, file\1") 
     # note^ ^ ^
['file-1', 'file_1', 'file\\1'] 
+0

我正在阅读你提到的python文档。直到这一行都是很好的......“但是,要将它表示为Python字符串文字,则必须再次转义两个反斜杠。” 此外,当您使用反斜杠内部字符集[]其特殊的含义应该走正确的..所以我的正则表达式可以安全地是: re.findall(“文件[\] 1”,“文件1 file_1,文件\ 1 “)....当然这不起作用。 其次,如果我使用正则表达式的原始字符串,那么特殊字符会自动被省略。因此,这将是: re.findall(R “文件[\] 1”, “文件1 file_1,文件\ 1”) 为什么原始字符串+额外\ –

+0

@SagarKarale方括号中*只有正则表达式的特殊含义* 已移除。您仍然需要将反斜杠加倍或使其成为原始字符串以除去*字符串字面特殊含义*。 – jonrsharpe

+0

谢谢乔恩..更多的例子清楚地表明......我不得不比以前更多地考虑“字符串文字”和“正则表达式”...... –