-1

使用我正在使用的代码(r' ', ' '),更改a a a a(r' a', a' a'),它应该何时更改为(r' a', ' '),. 有什么更自然的方法来做到这一点?我该怎么做re.sub

当前代码,请参见此处

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'),

djangogui 的屏幕截图

4

1 回答 1

2

使用正则表达式有很多方法可以实现这一点,这里有一个:

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

我不是一个好老师,正则表达式很难理解,我还是会试着把它分解给你:

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

随意尝试它,删除 count 参数和类似的东西。但是你必须在某个时候学习正则表达式,所以你应该把它看作是阅读神圣手册的好机会。了解正则表达式将使您成为更好的程序员,并让您拥有对文本数据的控制权。

于 2012-10-31T18:54:31.997 回答