Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Regex:用另一个模式替换一个模式_Python_Regex_Python 2.7 - Fatal编程技术网

Python Regex:用另一个模式替换一个模式

Python Regex:用另一个模式替换一个模式,python,regex,python-2.7,Python,Regex,Python 2.7,我试图用另一个正则表达式模式替换一个正则表达式模式 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和\2的原因是捕获值01和02,

我试图用另一个正则表达式模式替换一个正则表达式模式

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和\2
的原因是捕获值
01和02
,并在
S\1E\2
中使用它

我期望的输出是:

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

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

您需要捕获您试图保存的内容。试试这个:

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

你需要捕捉你想要保存的东西。试试这个:

pattern = re.compile(r'(\d+)x(\d+)') # for st_srt
st_srt = re.sub(pattern, r'S\1E\2', st_srt)
尝试使用此正则表达式:

([\w+\.]+){5}\-\w+
将stirngs复制到此处:

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

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

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

编辑:

这是我过去常做的事,你想做的事:

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'
尝试使用此正则表达式:

([\w+\.]+){5}\-\w+
将stirngs复制到此处:

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

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

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

编辑:

这是我过去常做的事,你想做的事:

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'

看起来你已经接受了一个答案,但我想这就是你所说的你要做的,就是从'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

看起来你已经接受了一个答案,但我想这就是你所说的你要做的,就是从'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


您不是用另一个正则表达式替换正则表达式,而是使用正则表达式用另一个字符串替换字符串。非常重要的区别。相信我,使用正则表达式处理其他正则表达式是一个你不需要的噩梦。@JustinMorgan:谢谢你的输入,但是,用另一个正则表达式替换一个正则表达式或使用基于正则表达式的解决方案实现所需输出的正确方法是什么呢?我想你的意思是,你想在搜索字符串中捕获一个组,然后在替换字符串中使用该组。@Noob:请看我的答案,这应该可以解决你的问题。但重要的是要明白,你不是在试图用另一个正则表达式替换一个正则表达式
Awake.01x02.iNTERNAL.WEBRiP.XViD GeT.srt
是您的输入字符串,而不是正则表达式。当人们提到“regex”时,他们通常指的是您正在使用的模式,在本例中是
\d+x\d+
@Noob:您是否试图使用st_mkv字符串作为更改st_srt字符串的模式?您不是用另一个regex替换一个regex,而是用一个regex用另一个字符串替换一个字符串。非常重要的区别。相信我,使用正则表达式处理其他正则表达式是一个你不需要的噩梦。@JustinMorgan:谢谢你的输入,但是,用另一个正则表达式替换一个正则表达式或使用基于正则表达式的解决方案实现所需输出的正确方法是什么呢?我想你的意思是,你想在搜索字符串中捕获一个组,然后在替换字符串中使用该组。@Noob:请看我的答案,这应该可以解决你的问题。但重要的是要明白,你不是在试图用另一个正则表达式替换一个正则表达式
Awake.01x02.iNTERNAL.WEBRiP.XViD GeT.srt
是您的输入字符串,而不是正则表达式。当人们提到“regex”时,他们通常指的是您正在使用的模式,在本例中是
\d+x\d+
@Noob:您是否试图使用st_mkv字符串作为更改st_srt字符串的模式?(1)您应该使用原始字符串。(2) 如果不打算对其返回值执行任何操作,则不应调用
re.sub
。。-)现在我得到了
'Awake.S\x01E\x02.iNTERNAL.WEBRiP.XViD GeT.srt'
@ruakh-谢谢,我剪切并粘贴了他的python代码,假设它是正确的。我是一个喜欢正则表达式的人,不是一个喜欢python的人。你能帮我解释一下语法吗?如果我把输入字符串改为
st_srt='Awake.01x03.iNTERNAL.WEBRiP.XViD GeT.srt'
我需要正则表达式输出为
'Awake.S01E03.iNTERNAL.WEBRiP.XViD GeT.srt'
,但是如果我使用你的解决方案,输出是
'Awake.S\x01E\x02.iNTERNAL.WEBRiP.XViD GeT.srt'
。因此,对于
st_srt
@Noob的任何值都是一样的。如果不使用原始字符串,Python会将反斜杠解释为Python字符串转义序列
\1
\2
\x01
\x02
同义,它们是标题的开头和文本字符的开头,而不是您想要的。对于原始字符串,Python将反斜杠解释为反斜杠,正则表达式引擎会正确地解释它们。(1)应该使用原始字符串。(2) 如果不打算对其返回值执行任何操作,则不应调用
re.sub
。。-)现在我得到了
'Awake.S\x01E\x02.iNTERNAL.WEBRiP.XViD GeT.srt'
@ruakh-谢谢,我剪切并粘贴了他的python代码,假设它是正确的。我是一个喜欢正则表达式的人,不是一个喜欢python的人。你能帮我解释一下语法吗?如果我把输入字符串改为
st_srt='Awake.01x03.iNTERNAL.WEBRiP.XViD GeT.srt'
我需要正则表达式输出为
'Awake.S01E03.iNTERNAL.WEBRiP.XViD GeT.srt'
,但是如果我使用你的解决方案,输出是
'Awake.S\x01E\x02.iNTERNAL.WEBRiP.XViD GeT.srt'
。因此,对于
st_srt
@Noob的任何值都是一样的。如果不使用原始字符串,Python会将反斜杠解释为Python字符串转义序列
\1
\2
\x01
\x02
同义,它们是标题的开头和文本字符的开头,而不是您想要的。对于原始字符串,Python将反斜杠解释为反斜杠,正则表达式引擎会正确地解释它们。我认为OP需要更多的解释。您可能需要将
m=replace_pattern.match(st_mkv)
更改为
m=replace_pattern.match(st_srt)
@AlexW:dude,如果您要将我的答案复制并粘贴到您的答案中,您可能至少应该更改所有变量名:)@alan我不懂。。