可以在同一个正则表达式中引用以前的组吗?

时间:2015-04-02 05:07:41

标签: python regex

我正在尝试在Python中执行正则表达式。我想匹配没有域扩展名的文件路径,另外,我只想获得最后一个' \'之后最多20个字符的文件路径。的文件路径。例如,给定数据:

c:\users\docs\cmd.exe
c:\users\docs\files\ewyrkfdisadfasdfaffsfdasfsafsdf
c:\users\docs\files\target

我希望匹配' target',而不是其他两行。应该注意的是,在我目前的情况下,使用re模块或python操作不是一个选项,因为这个正则表达式被送入程序(使用re.match()),所以我在正则表达式字符串。

我有两个正则表达式:

^([^.]+)$ will match the the last 2 lines

([^\\]{,20}$) will match 'cmd.exe' and 'target'

如何将这两者合并为一个正则表达式?我尝试了反向引用(?P =等),但无法使其工作。这甚至可能吗?

2 个答案:

答案 0 :(得分:2)

\\([^\\.]{1,20})(?:$|\n)怎么样?它似乎对我有用。

  • \\转义为字面反斜杠。
  • (捕获组的开始。
  • [^\\.]匹配除文字反斜杠或文字点字符
  • 之外的任何内容
  • {1,20}匹配班级1-20次,尽可能多次(贪婪)。
  • )结束捕获组。
  • (?:启动非捕获组
  • $匹配字符串的结尾。
  • |是此论坛的“或”运算符
  • \n匹配换行符或换行符(ASCII 10)
  • )非捕获组结束

为了创建这个,我使用https://regex101.com/#python这是我认为非常好的资源,因为它解释了正则表达式的每个部分并且实时地整齐地显示了捕获的组。

答案 1 :(得分:1)

>>> s = r"""c:\users\docs\cmd.exe
... c:\users\docs\files\ewyrkfdisadfasdfaffsfdasfsafsdf
... c:\users\docs\files\target""".split('\n')
>>> [re.match(r'.*\\([^.]{,20})$', x) for x in s]
[None, None, <_sre.SRE_Match object at 0x7f6ad9631558>]

>>> [re.findall(r'.*\\([^.]{,20})$', x) for x in s]
[[], [], ['target']]

这意味着:

.*\\ - 抓住所有内容,包括最后一个\ ([^.]{,20}) - 确保剩余的最多20个字符中没有. $ - 行尾

中间组周围的()表示它应该是作为匹配项返回的组