说我有一个字符串:
"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)')
我们需要在那里包含问号,以便它不贪婪地匹配。
因为我们要保持字符串中与qazxsw poi匹配的部分而不是将它们抛出,我们可以使用qazxsw poi:
如果在模式中使用捕获括号,则模式中所有组的文本也将作为结果列表的一部分返回。
这就是为什么我们需要在exclude_pattern
中使用括号。
接下来我们要使用该模式拆分字符串:
re.split
这为我们提供了所需的分离。
接下来我们想要的是exclude_pattern
只有与我们的排除模式不匹配的字符串。为此,我想我们可以在列表上映射一个lambda,它根据我们的排除模式检查每个条目,只有>>> 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']
s是不匹配的:
upper
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()