更改捕获组中的文本

时间:2012-10-28 17:24:51

标签: python regex django

使用代码我(r' ', ' '),更改a a a a(r' a', a' a'),时应更改为(r' a', ' '),。这是一种更自然的方式吗?如何使用re.sub

执行此操作

当前代码,请参阅here

for key, value in newgroupdict.items():
    try:
        newstr = newstr.replace(re.search(e, line).group(key), value)
    except:
        pass

示例:

Expression: \s*(?:url)?\(r?["|'](?P<pattern>[^'"]+)["|'],\s*["|']?direct_to_template["|']?,\s*{["|']template["|']:\s*["|'](?P<template>[^'"]+)["|']}\),
String:     (r'^$', direct_to_template, {'template': 'home.html'}),
Dictionary: {u'pattern': u'^$abc', u'type': u'direct to template', u'template': u'home.html'}
Output:     (r'^$abc', direct_to_template, {'template': 'home.html'}),

Expression: \s*(?:url)?\(r?["|'](?P<pattern>[^'"]+)["|'],\s*["|']?(?P<view>[^'"]+)["|']?\),
String:     (r'^urls/', 'urls.views.urls'),
Dictionary: {u'pattern': u'^new_urls_pattern/', u'type': u'view', u'view': u'urls.views.urls'}
Output:     (r'^new_urls_patterns/', 'urls.views.urls'),

================= Incorrect Output ========================

Expression: \s*(?:url)?\(r?["|'](?P<pattern>[^'"]+)["|'],\s*["|']?(?P<view>[^'"]+)["|']?\),
String:     (r'^urls/', 'urls'),
Dictionary: {u'pattern': u'^new_urls_pattern/', u'type': u'view', u'view': u'urlsxyz'}
Incorrect Output:     (r'^urlsxyz/', 'urlsxyz'),
Correct Output:     (r'^urls/', 'urlsxyz'),

screenshot of djangogui

1 个答案:

答案 0 :(得分:2)

使用正则表达式实现此目的的方法有很多种,其中之一是:

In [23]: re.sub(r"'([^']+)'", r"'\1a'", "(r' ', ' '),", 1)
Out[23]: "(r' a', ' '),"

我不是一个好老师,而且regexps很难理解,我仍然会试着把它分解给你:

  • 使用re.sub,使用的参数:
    • 第一个参数是regexp,
    • 第二个是 replacement regexp,
    • 第三个是主题,你想要工作的字符串,
    • 和finnaly是应用替换的次数,
  • 使用第一个正则表达式:
    1. '将匹配字符串主题中的'
    2. (打开论坛\1,在此)之间找到的任何内容都将在论坛\1中,
    3. [^']匹配'
    4. 之外的任何字符
    5. +表示可以重复前一个字符类([^']),
    6. '将与'
    7. 相匹配
  • 替换正则表达式:
    • 放置'以补偿1中的替换'
    • 放置在\1组中匹配的内容,从2.到4.,所有非'个字符,
    • 放置'以补偿模式regexp中的最后'

随意尝试,删除count参数和类似的东西。但是你会 在某个时候学习regexp,所以你应该把它看作是阅读the holy manual的好机会。知道正则表达式将使你成为一个更好的程序员,并让你掌控文本数据。