匹配前面带有' s'的数字。并由' /'成功

时间:2018-01-12 18:38:40

标签: python regex

我有一个文件名列表,它们都是这样的:

orl_faces/s22/3.pgm

我正在尝试提取字母s前面的数字,如下所示:

re.findall(r'\[s][0-9]*','orl_faces/s22/3.pgm')

但它没有用,有什么建议吗?

5 个答案:

答案 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不匹配,因为您在[之前放了一个反斜杠,因此它按字面解释)。

代码

See it in use here

(?<=s)\d+(?=/)

确保/先于s您可以使用(?<=/s)\d+(?=/)

用法

See code in use here

import re

r = r"(?<=s)\d+(?=/)"
s = "orl_faces/s22/3.pgm"

print(re.findall(r, s))

说明

  • (?<=s)肯定的背后隐藏确保匹配s字面上的内容
  • \d+匹配一个或多个数字
  • (?=/)确定后面的内容与/字面意义相符
    • OP指定的号码前面有s后面有/