2012-03-30 47 views
0

我想用另一个正则表达式模式替换一个正则表达式模式。正则表达式:用另一个替换一个模式

st_srt = 'Awake.01x02.iNTERNAL.WEBRiP.XViD-GeT.srt' 
st_mkv = 'Awake.S01E02.iNTERNAL.WEBRiP.XViD-GeT.mkv' 

pattern = re.compile('\d+x\d+') # for st_srt 
re.sub(pattern, 'S\1E\2',st_srt) 

我知道使用S\1E\2这里是错误的。我使用\1 and \2的原因是为了获得值01 and 02并在S\1E\2中使用它。

我所需的输出是:

st_srt = 'Awake.S01E02.iNTERNAL.WEBRiP.XViD-GeT.srt' 

那么,什么是实现这一目标的正确方法。

+1

你不能用另一个替换正则表达式正则表达式,你正在使用正则表达式来替换另一个字符串的字符串。非常重要的区别。相信我,使用正则表达式来处理* other * regexes是你不需要的噩梦。 – 2012-03-30 21:22:44

+0

@JustinMorgan:感谢您的输入,但比用正则表达式替换另一个正则表达式还是使用基于正则表达式的解决方案来实现我所需的输出更为正确。 – RanRag 2012-03-30 21:24:50

+0

我认为你的意思是你想在你的搜索字符串中捕获一个组,并在替换字符串中使用该组。 – alan 2012-03-30 21:26:43

回答

2

你需要捕捉你想要保存的内容。试试这个:使用此正则表达式

pattern = re.compile(r'(\d+)x(\d+)') # for st_srt 
st_srt = re.sub(pattern, r'S\1E\2', st_srt) 
+0

(1)你应该使用原始字符串。 (2)如果你不打算用它的返回值做任何事情,你不应该调用're.sub'。 ;-) – ruakh 2012-03-30 21:29:01

+0

现在我们得到了'Awake.S \ x01E \ x02.iNTERNAL.WEBRiP.XViD-GeT.srt'。 – RanRag 2012-03-30 21:29:53

+0

@ruakh - 谢谢,我在假定它正确的情况下剪切并粘贴了他的python代码。我是一个正规人,而不是一个蟒蛇人。你能帮助语法吗? – 2012-03-30 21:32:15

1

尝试:

([\w+\.]+){5}\-\w+ 

的stirngs复制到这里:http://www.gskinner.com/RegExr/

并粘贴正则表达式在顶部。

它捕获每个字符串的名称,忽略扩展名。

然后,您可以继续并将所需的扩展名附加到所需的字符串。

编辑:

这就是我用来做你以后:

import re 
st_srt = 'Awake.01x02.iNTERNAL.WEBRiP.XViD-GeT.srt' // dont actually need this one 
st_mkv = 'Awake.S01E02.iNTERNAL.WEBRiP.XViD-GeT.mkv' 
replace_pattern = re.compile(r'([\w+\.]+){5}\-\w+') 
m = replace_pattern.match(st_mkv) 

new_string = m.group(0) 
new_string += '.srt' 

>>> new_string 
'Awake.S01E02.iNTERNAL.WEBRiP.XViD-GeT.srt' 
+0

我认为OP需要多一点解释。 – RanRag 2012-03-30 21:55:33

+0

您可能希望将'm = replace_pattern.match(st_mkv)'更改为'm = replace_pattern.match(st_srt)'。 – RanRag 2012-03-30 22:11:27

+0

@AlexW:老兄,如果你要将我的答案复制并粘贴到你的答案中,你应该至少改变所有的变量名称:) – alan 2012-03-30 22:12:41

2

嗯,看起来你已经接受了答案,但我想这是你说你”再试图做的,这是摆脱“st_mkv”替换字符串,然后在“st_srt”使用它:

import re 
st_srt = 'Awake.01x02.iNTERNAL.WEBRiP.XViD-GeT.srt' 
st_mkv = 'Awake.S01E02.iNTERNAL.WEBRiP.XViD-GeT.mkv' 

replace_pattern = re.compile(r'Awake\.([^.]+)\.') 
m = replace_pattern.match(st_mkv) 
replace_string = m.group(1) 

new_srt = re.sub(r'^Awake\.[^.]+\.', 'Awake.{0}.'.format(replace_string), st_srt) 
print new_srt 
+0

+1谢谢你另一个很好的答案。 – RanRag 2012-03-30 21:52:51

0
import re 

st_srt = 'Awake.01x02.iNTERNAL.WEBRiP.XViD-GeT.srt' 

st_mkv = 'Awake.S01E02.iNTERNAL.WEBRiP.XViD-GeT.mkv' 

pattern = re.compile(r'(\d+)x(\d+)') 

st_srt_new = re.sub(pattern, r'S\1E\2', st_srt) 

print st_srt_new 
相关问题