重新匹配match.group

时间:2014-12-19 23:53:28

标签: python regex

for element in f:
   galcode_scan = re.search(ur'blah\.blah\.blah\(\'\w{5,10}', element)

如果我尝试执行re.sub并用其他东西删除blahs并保留最后一位,则\ w {5,10}变为文字。如何保留正则表达式中占用的字符?

编辑:

这是完整的代码

for element in f:
  galcode_scan = re.search(ur'Imgur\.Util\.triggerView\(\'\w{5,10}', element)
  galcode_scan = re.sub(r'Imgur\.Util\.triggerView\(\'\w{5,10}', 'blah\.\w{5,10}',   ur"galcode_scan\.\w{5,10}")
  print galcode_scan

2 个答案:

答案 0 :(得分:1)

您可以使用正向前瞻((?=...))在替换时不匹配,但匹配整个模式:

re.sub("blah\.blah\.blah\(\'(?=\w{5,10})", "", "blah.blah.blah('qwertyu")
  

' qwertyu'

如果要替换匹配,只需将其添加到替换参数:

re.sub("blah\.blah\.blah\(\'(?=\w{5,10})", "pref:", "blah.blah.blah('qwertyu")
  

' PREF:qwertyu'

您也可以通过捕获模式((..))并反向引用它(\1 .. \9)来实现:

re.sub("blah\.blah\.blah\(\'(\w{5,10})", "pref:\\1", "blah.blah.blah('qwertyu")
  

' PREF:qwertyu'

<强>更新

提供的例子的更精确的模式:

re.sub("Imgur\.Util\.triggerView'(?=\w{5,10})", "imgurl.com/", "Imgur.Util.triggerView'B1ahblA4")
  

&#39; imgurl.com/B1ahblA4'

这里的模式是一个简单的字符串,所以无论你需要什么动态,你都可以使用变量。例如,使用不同的映射:

map = {
  'Imgur\.Util\.triggerView\'': 'imgurl.com/',
  'Example\.Util\.triggerView\'': 'example.com/'
}

items = [
  "Imgur.Util.triggerView'B1ahblA4",
  "Example.Util.triggerView'FooBar"
]

for item in items:
  for old, new in map.iteritems():
    pattern = old + '(?=\w{5,10})'
    if re.match(pattern, item):
      print re.sub(pattern, new, item)
  

imgurl.com/B1ahblA4

     

example.com/FooBar

答案 1 :(得分:0)

你也可以这样工作:

import re
element = "Imgur.Util.triggerView('glglgl')"
galcode_scan = re.search(ur'Imgur\.Util\.triggerView\(\'(\w{5,10})\'\)', element)

现在你有了一个可以进一步使用的匹配对象:使用

galcode_scan.expand('replacement.\\1')
galcode_scan.expand('replacement.\g<1>')

结果会得到replacement.glglgl

这可以通过将替换字符串应用于捕获的组来实现。