下划线周围的三个python正则表达式

时间:2013-03-06 20:38:01

标签: python regex expression

我正在使用支持python正则表达式语法的应用程序帮助某人在工作时重命名一些文件。我尝试了在^[^_]+(?=_)等论坛上找到的一些表达式,但是它没有正常工作,而其他一些表达不起作用。所以,我想我应该联系那些真正知道自己在做什么的人。谢谢你的帮助。

a)在第一个表达式中,我必须在第一个下划线之前找到所有字符,如下所示:

cannon_mac_23567_prsln_333
jones_james_343342_prsln_333
smith_john_223462_prsln_333

所以,我必须得到大炮,琼斯和史密斯

b)在单独的表达式中,我必须找到第一个和第二个下划线之间的所有字符。所以,我需要在上面的例子中找到mac,james和john。

c)在最后一个表达式中,我必须找到第一个下划线

重命名应用程序的工作方式我必须分三部分执行这些正则表达式,如上所述。感谢。

3 个答案:

答案 0 :(得分:3)

好吧,你可以完全没有正则表达式,因为你知道你的分隔符是下划线。

使用 str.split index方法。

'smith_john_223462_prsln_333'.split('_')[0] //(to extract smith)
'smith_john_223462_prsln_333'.split('_')[1] //(to extract john)
'smith_john_223462_prsln_333'.index('_') //(to get position of first underscore)

答案 1 :(得分:1)

我会用:

1.  ^([^_]+)_
2.  _([^_]+)_ 
3.  ^[^_]_

使用re.match,因为它匹配字符串的开头。

[编辑:正如Cthulhu指出的那样,你最好不要使用正则表达式,因为它使用字符串方法更快更容易]

答案 2 :(得分:1)

是的,我一开始误解了你的问题。虽然str.split肯定是一种更优雅的解决方法,但这里有三个正则表达式可以满足您的需求。我不知道你的这个应用程序是否适用于它们。所以带上一粒盐。

请查看re图书馆和MatchObject.span()以获取更多信息。

作为一个正则表达式:

import re
line = "cannon_mac_23567_prsln_333"
In [1812]: match = re.match(r"(.+?)(\_)(.+?)\_", line)

In [1813]: match.groups()
Out[1813]: ('cannon', '_', 'mac')

In [1814]: match.span(2)[0] <-- second group, start. The first occurence of _
Out[1814]: 6

In [1815]: line[6]
Out[1815]: '_'

在a,b,c:

中分类

a:

import re
line = "cannon_mac_23567_prsln_333"
In [1707]: match = re.match(r"(.+?)\_", line)

In [1708]: match.groups()
Out[1708]: ('cannon',)

B:

In [1712]: match = re.match(r".+\_(.+?)\_", line)

In [1713]: match.groups()
Out[1713]: ('prsln',)

c:最后一个使用re.search来简化。 MatchObject.span()返回位置(start, end)

的元组
In [1763]: match = re.search("\_", line)

In [1764]: match.span()[0]
Out[1764]: 6

In [1765]: line[6]
Out[1765]: '_'