函数对字符串的所有部分进行操作,这些部分与正则表达式模式不匹配

问题描述 投票:1回答:1

说我有一个字符串:

"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应用于这些。

python regex regex-negation
1个回答
1
投票

我不确定是否有办法用一个正则表达式做到这一点,但这是我的思考过程。我想我们要将字符串拆开,以便我们只能将不在排除块中的部分大写。这样做的方法是使正则表达式匹配排除块:

>>> 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()
© www.soinside.com 2019 - 2024. All rights reserved.