【问题标题】:Regex named groups and conditional logic正则表达式命名组和条件逻辑
【发布时间】:2015-02-04 09:21:39
【问题描述】:

考虑以下字符串(编辑:这不是解析带有正则表达式问题的 HTML。而只是一个命名组的练习):

s = """<T1>
        <A1>
        lorem ipsum
        </A1>
      </T1>"""

是否可以使用re.sub 和命名组将字符串转换成这个结果?

<T1>
  <test number="1">
  lorem ipsum
  </test>
</T1>

现在我有以下代码:

import re
regex = re.compile("(<(?P<end>\/*)A(?P<number>\d+)>)")
print regex.sub('<\g<end>test number="\g<number>">', s)

给出以下结果

<T1>
  <test number="1">
  lorem ipsum
  </test number="1">
</T1>

| 运算符可以像 question 那样使用吗?

【问题讨论】:

  • 永远不要使用正则表达式来解析 html 或 xml ,而是使用适合此任务的适当模块,例如 lxml 或 ...
  • 我明白(通常我会一直使用lmxl)。这只是我对re的理解的练习。

标签: python regex


【解决方案1】:

尝试匹配整个标签。不仅是开始标签和结束标签,还包括它的内容。

正则表达式:

(<(?P<end>\/*)(A)(?P<number>\d+)>)(.*?)</\3\4>

替换字符串:

<test number="\g<number>">\5</test>

DEMO

>>> s = """<T1>
        <A1>
        lorem ipsum
        </A1>
      </T1>"""
>>> import re
>>> print(re.sub(r'(?s)(<(?P<end>\/*)(A)(?P<number>\d+)>)(.*?)</\3\4>', r'<test number="\g<number>">\5</test>', s))
<T1>
        <test number="1">
        lorem ipsum
        </test>
      </T1>

(?s) 称为 DOTALL 修饰符,它匹配使正则表达式中的点也匹配换行符。

【讨论】:

  • 这很有意义。我没有考虑匹配所有内容,然后只在替换字符串中包含&lt;/test&gt;。谢谢!
【解决方案2】:

您可以使用环视来匹配&lt;T1&gt;&lt;/T1&gt; 之间的字符串:

>>> p = re.compile(ur'(?<=<T1>)[^<]+?(.+)(?=</T1>)', re.MULTILINE | re.IGNORECASE | re.DOTALL)
>>> s2='\n  <test number="1">\n  lorem ipsum\n  </test>\n'
>>> print p.sub(s2,s,re.MULTILINE)
<T1>
  <test number="1">
  lorem ipsum
  </test>
</T1>

您需要使用以下Contents

re.IGNORECASE 执行不区分大小写的匹配;像 [A-Z] 这样的表达式也将匹配小写字母。这不受当前语言环境的影响。

re.MULTILINE 指定时,模式字符 '^' 匹配字符串的开头和每行的开头(紧跟在每个换行符之后);并且模式字符 '$' 匹配字符串的末尾和每行的末尾(紧接在每个换行符之前)。默认情况下,'^' 仅匹配字符串的开头,而 '$' 仅匹配字符串的末尾以及字符串末尾的换行符(如果有)之前。

re.DOTALL 制作“。”特殊字符完全匹配任何字符,包括换行符;没有这个标志,'.'将匹配除换行符以外的任何内容。

【讨论】:

  • @Jeff 不客气,请注意,在这种情况下使用以下内容可能会很有帮助
【解决方案3】:
x="""<T1>
    <A1>
    lorem ipsum
    </A1>
  </T1>"""

def repl(obj):

    if obj.group(1):
        return '/test'
    else:
        return 'test number="'+obj.group(2)+'"'

print re.sub(r"(\/*)A(\d+)",repl,x)

您可以使用re.sub提供的替换功能。

【讨论】:

  • @Jeff 不客气。您可以使用此技术根据捕获获得困难的替代品。
猜你喜欢
  • 2010-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多