python - 对与正则表达式模式不匹配的字符串的所有部分进行操作的函数
问题描述
假设我有一个字符串:
"a bb c exclude_start d 3 f g h _ k l . exclude_end n 0 P exclude_start q r exclude_end s"
并说我会应用一个upper
将返回的函数:
"A BB C exclude_start d 3 f g h _ k l . exclude_end N 0 P exclude_start q r exclude_end S"
我想要一个解决方案,它允许n
排除块的数量,并将该upper
功能仅应用于这些块之外的字符。
如果有一种方法regex
只匹配 之外的字符串,那就太好了excludes
,然后只适用upper
于这些。
解决方案
我不确定是否有办法用一个正则表达式来做到这一点,但这是我的思考过程。我想我们想把字符串分开,这样我们就可以只大写那些不在排除块中的部分。这样做的方法是制作一个正则表达式来匹配排除块:
>>> import re
>>> exclude_pattern = re.compile(r'(exclude_start.*?exclude_end)')
我们需要在其中包含问号,以免它贪婪地匹配。
由于我们希望保留与我们匹配的字符串部分,exclude_pattern
而不是仅仅将它们丢弃,我们可以使用re.split
:
如果在pattern中使用了捕获括号,那么 pattern 中所有组的文本也会作为结果列表的一部分返回。
这就是为什么我们需要在exclude_pattern
.
接下来我们要使用该模式拆分字符串:
>>> input_string = "a bb c exclude_start d 3 f g h _ k l . exclude_end n 0 P exclude_start q r exclude_end s"
>>> exclude_pattern.split(input_string)
['a bb c ', 'exclude_start d 3 f g h _ k l . exclude_end', ' n 0 P ', 'exclude_start q r exclude_end', ' s']
这给了我们需要的分离。
我们想要的下一件事是upper
只处理与我们的排除模式不匹配的字符串。为此,我认为我们可以在列表上映射一个 lambda,根据我们的排除模式检查每个条目,并且只有upper
那些不匹配的条目:
>>> list(map(lambda s: s.upper() if not exclude_pattern.match(s) else s, exclude_pattern.split(input_string)))
['A BB C ', 'exclude_start d 3 f g h _ k l . exclude_end', ' N 0 P ', 'exclude_start q r exclude_end', ' S']
这list()
只是为了让我们可以看到结果地图对象中的内容。
之后,我们将它们重新组合在一起:
>>> ''.join(map(lambda s: s.upper() if not exclude_pattern.match(s) else s, exclude_pattern.split(input_string)))
'A BB C exclude_start d 3 f g h _ k l . exclude_end N 0 P exclude_start q r exclude_end S'
如果您不想将其作为单行(这有点恶心),我们可以将其变成一个函数:
def excluded_upper(input_string):
exclude_pattern = re.compile(r'(exclude_start.*?exclude_end)')
split_string = exclude_pattern.split(input_string)
output = []
for s in split_string:
if exclude_pattern.match(s):
output.append(s)
else:
output.append(s.upper())
return ''.join(output)
推荐阅读
- c - 当结构按值传递给函数时,结构内的指针似乎发生了变化
- python - 编码按钮 Yandex POST 数据
- rust - 如何在编译期间从 Rust 中的字符串文字中删除空格?
- flask - 谷歌云运行突然流量峰值错误
- c++ - 卡在正确地从 txt 文件中读取凭据
- javascript - 获取 shadow DOM 的 document.body/html
- android - 如何将撰写预览导出为 png/jpg
- prestashop - prestashop 1.7.8.0 polyfill-intl-normalizer 中的错误更新
- python - 怎么解决
Python中的错误? - javascript - 解构 JavaScript 对象