我有一个文件名列表,它们都是这样的:
orl_faces/s22/3.pgm
我正在尝试提取字母s前面的数字,如下所示:
re.findall(r'\[s][0-9]*','orl_faces/s22/3.pgm')
但它没有用,有什么建议吗?
答案 0 :(得分:2)
零宽度正面观察:
(?<=s)\d+
\d+
匹配一个或多个数字,(?<=s)
确保s
位于数字前面边缘情况:
例如,对于字符串orl_faces3/s22/3.pgm
,它将匹配3
。因此,我们需要提供更严格的模式,根据您的示例,我们可以选择匹配/s3
作为前一个标记:
(?<=/s)\d+
这可能是其他内容,例如/
需要跟随的数字,/
具有正向预测:
(?<=/s)\d+(?=/)
你需要找出确切的用例。
另一种选择是使用re.findall
并获取列表中的所有匹配并选择 - 但这非常脆弱且适得其反,最好使用限制性规则模式。
示例:强>
In [64]: s = 'orl_faces/s22/3.pgm'
In [65]: re.search(r'(?<=s)\d+', s).group()
Out[65]: '22'
In [66]: s = 'orl_faces3/s22/3.pgm'
In [67]: re.search(r'(?<=s)\d+', s).group()
Out[67]: '3'
In [68]: re.search(r'(?<=/s)\d+(?=/)', s).group()
Out[68]: '22'
答案 1 :(得分:1)
您可以使用群组运营商:
match = re.search(r'/s(\d+)/', my_string)
print(match.group(1))
答案 2 :(得分:1)
>>> re.findall(r's(\d+)/', 'orl_faces/s22/3.pgm')
['22']
答案 3 :(得分:1)
这对我有用:
re.search(r'/s([0-9]+)/','orl_faces/s22/3.pgm')[1]
'22'
答案 4 :(得分:1)
您的表达式使用\[s]
。这与[s]
按字面意思匹配(它只与s
不匹配,因为您在[
之前放了一个反斜杠,因此它按字面解释)。
(?<=s)\d+(?=/)
确保/
先于s
您可以使用(?<=/s)\d+(?=/)
import re
r = r"(?<=s)\d+(?=/)"
s = "orl_faces/s22/3.pgm"
print(re.findall(r, s))
(?<=s)
肯定的背后隐藏确保匹配s
字面上的内容\d+
匹配一个或多个数字(?=/)
确定后面的内容与/
字面意义相符
s
而后面有/