我正在使用支持python正则表达式语法的应用程序帮助某人在工作时重命名一些文件。我尝试了在^[^_]+(?=_)
等论坛上找到的一些表达式,但是它没有正常工作,而其他一些表达不起作用。所以,我想我应该联系那些真正知道自己在做什么的人。谢谢你的帮助。
a)在第一个表达式中,我必须在第一个下划线之前找到所有字符,如下所示:
cannon_mac_23567_prsln_333
jones_james_343342_prsln_333
smith_john_223462_prsln_333
所以,我必须得到大炮,琼斯和史密斯
b)在单独的表达式中,我必须找到第一个和第二个下划线之间的所有字符。所以,我需要在上面的例子中找到mac,james和john。
c)在最后一个表达式中,我必须找到第一个下划线
重命名应用程序的工作方式我必须分三部分执行这些正则表达式,如上所述。感谢。
答案 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]: '_'