【问题标题】:python regex conditional in re.sub - how?re.sub 中的python regex 条件 - 如何?
【发布时间】:2019-02-22 18:10:13
【问题描述】:

是否可以在re.sub() 中使用python 的正则表达式条件?我已经尝试了许多变体,但没有运气。这就是我所拥有的。

import re
# match anything: <test> always true
a = re.compile('(?P<test>.*)')  

# return _'yes'_ or 'no' based on <test>
a.sub('(?(\g<test>)yes|no)', 'word')
'(?(word)yes|no)'

我期待的是“是”或“否”,而不是实际的测试。

我从中得到的是看到&lt;test&gt;,但没有执行正则表达式条件。有没有其他方法可以做到这一点?

我尝试使用 re.sub(pat, rep, str) 得到相同的结果。

【问题讨论】:

  • 您能否在此基础上添加具有代表性的输入文本和所需的输出?
  • 我做到了。输入是'word',期望的输出是'yes'。
  • 您希望在什么情况下打印“否”?请注意,替换参数绝不是正则表达式。它是 1) 纯文本; 2) 对捕获组的引用或 3) 函数引用。
  • 有趣的是正则表达式组可用但正则表达式测试不可用。

标签: python regex conditional


【解决方案1】:

如果要执行条件替换,请使用 函数 作为 replace 参数。

此函数接受一个 match 参数(已捕获的内容) 其结果是要替换匹配的文本。

要在替换函数中引用名为 test 的捕获组, 使用group('test')

示例程序:

import re

def replTxt(match):
    return 'yes' if match.group('test') else 'no'

a = re.compile('(?P<test>.+)')  
result = a.sub(replTxt, 'word')
print(result)

但我有这样的说法:

no 不可能被这个程序取代。 如果正则表达式不匹配,replTxt 函数将不会被调用。

有可能 test 组不匹配,但匹配 已匹配:

  • 这个捕获组应该是有条件的(在它之后是?),
  • 为了不匹配空文本,正则表达式应包含 更多匹配的东西,例如(?P&lt;test&gt;[a-z]+)?\d

【讨论】:

  • 感谢@Valdi_Bo。这是有道理的,并且比我走的路径更具可读性。
猜你喜欢
  • 2019-01-28
  • 1970-01-01
  • 2015-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多