Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python正则表达式问题_Python_Regex - Fatal编程技术网

python正则表达式问题

python正则表达式问题,python,regex,Python,Regex,使用re.search查找并返回字符串中的文件扩展名的正确正则表达式语句是什么 例如: .+.avi | rar | zip | txt 我需要它来搜索字符串,如果它包含任何avi、rar等,则只返回该扩展名 谢谢 编辑:应添加不区分大小写的is,您需要: (.)\.(avi|rar|zip|txt)$ 注意反斜杠以避开圆点。这将使它查找文字点而不是任何字符 要使其不区分大小写,请在调用中使用RE.I标志 互动短跑: >>> import re >>> pa

使用re.search查找并返回字符串中的文件扩展名的正确正则表达式语句是什么

例如: .+.avi | rar | zip | txt

我需要它来搜索字符串,如果它包含任何avi、rar等,则只返回该扩展名

谢谢

编辑:应添加不区分大小写的is,您需要:

(.)\.(avi|rar|zip|txt)$
注意反斜杠以避开圆点。这将使它查找文字点而不是任何字符

要使其不区分大小写,请在调用中使用RE.I标志

互动短跑:

>>> import re
>>> pat="(.+)\.(avi|rar|zip|txt)"
>>> re.search(pat, "abcdefg.zip", re.IGNORECASE).groups()
('abcdefg', 'zip')
>>> re.search(pat, "abcdefg.ZIP", re.IGNORECASE).groups()
('abcdefg', 'ZIP')
>>> 
然后第2组将是扩展

我刚刚写了一篇关于正则表达式的博客
如果你想了解更多这方面的信息。

因为我认为正则表达式是邪恶的

def return_extension(filename):
    '''(This functions assumes that filenames such as `.foo` have extension
    `foo`.)
    '''
    tokens = filename.split('.')

    return '' if len(tokens) == 1 else tokens[-1]

…我主张只解析文件名。

如果您知道扩展名位于字符串的最末端,那么这应该可以很好地工作:

.\.(avi|rar|zip|txt)$
第一位将确保在点之前有一些字符

$指定文件扩展名位于字符串的末尾,即$表示字符串在此处结束。有关这方面的血淋淋的详细信息,包括一些您应该注意的带有换行符的边缘案例,请参见注释讨论,以及中的$条目


因此,match.groups元组中唯一的条目,即match.groups[0],将是扩展本身。

标准库更好

>>> os.path.splitext('hello.py')
('hello', '.py')

那么还有一个标志使Python解释器不区分大小写吗?否则,我们必须将re作为re导入才能找到re。I…通过将其更改为。\.avi | rar | zip | txt$:这将确保在点之前有一些字符,并且文件扩展名位于字符串的末尾,您可以使它变得更有效,更精确。这样一来,第一个匹配项就是扩展名,而不是第二个匹配项,并且不会保留不需要的匹配项。@Nick t:re.I标志只用于正则表达式模块。我不知道有什么方法可以使python的其余部分不区分大小写。@JoshD:我在开一个失败的玩笑,说你用一个设置不区分大小写的标志把大小写搞乱了。是我,而不是我。I@NickT:嗯,胡说八道。现在我看起来很傻。不过,我修复了答案。您真的要搜索字符串以查找第一个出现的.avi之类的内容,还是要检查字符串是否以该字符串结尾?问另一个问题,Fred今天发给我的字符串一般文本是foo.rar,还是应该包含您想要提取其扩展名的文件名或路径?重新设计轮子而不是重新设计车轴更糟糕。在这种情况下,这不是问题,但建议将regex文本作为原始字符串,避免双重逃逸。使用r.+\.avi|rar|zip|txt@intuited: -1. s/一些边缘案例/失败/@John Machin:废话,真的吗?我想不出有什么。示例是什么?@Intuite:默认非多行模式下blah\Z的理由是re.matchblah$,blah\n不会返回None@JohnMachin:我想你需要重新阅读我的答案,特别是警告,你知道扩展名在字符串的最末端。这是一个非常常见的用例,例如,您已经从文件或管道中读入并拆分了文件列表中的“\n”,因此似乎值得为其提供特定的解决方案。在这种情况下,我认为使用$实际上更好,因为它与fileinput.input兼容,而不必首先对行进行rstrip。@Intuite:我确实读了第一行,两次,两次决定不反对它。第三次不走运:如何知道扩展名在字符串的最末端?在任何情况下,无论您是否认为自己知道,\Z都能可靠地完成工作。从另一个角度来看,$是\n?\Z的一个高级替代品。。。fileinput.input?哦,是的,我记得,awk悲剧的Python拐杖——我在1998年某个时候停止使用它了。
.\.(avi|rar|zip|txt)$
>>> os.path.splitext('hello.py')
('hello', '.py')