首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将贪婪的元素替换为适当的

将贪婪的元素替换为适当的
EN

Stack Overflow用户
提问于 2018-01-12 02:38:58
回答 2查看 69关注 0票数 1

我有以下清单:

代码语言:javascript
复制
import re
l = ['Part I,   Where I’M Coming From',
 'Part Ii,  Life Principles',
 'Part Iii, Work Principles']

我想要结果,

代码语言:javascript
复制
l = ['Part I,   Where I’M Coming From',
     'Part II,  Life Principles',
     'Part III, Work Principles']

我试过:

代码语言:javascript
复制
In [19]: [re.sub(r'(?<=I)i+', 'I+', s) for s in l]
Out[19]:
['Part I,   Where I’M Coming From',
 'Part II+,  Life Principles',
 'Part II+, Work Principles']

它输出'Part II+, Work Principles'而不是'Part III, Work Principles'

如何完成这样的任务?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-12 02:42:28

一个简单的方法是将re.sub与回调函数一起使用。回调处理比简单替换更复杂的逻辑。在您的例子中,您需要匹配所有小写i的大写I,计算出有多少i,并相应地替换。

代码语言:javascript
复制
>>> re.sub('(?<=I)(i+)', lambda x: 'I' * len(x.group()), 'Part Iii,  Work Principles')
'Part III,  Work Principles'

如果没有匹配,则不调用回调(即不发生替换)。

如果您对所发生的事情有更深入的了解,下面是一个函数的回调,带有几个print语句。

代码语言:javascript
复制
>>> def replace(m):
...     print(*[m, m.group(), len(m.group())], sep='\n')
...     return 'I' * len(m.group())
... 
>>> re.sub('(?<=I)(i+)', replace, 'Part Iii,  Work Principles')
<_sre.SRE_Match object; span=(6, 8), match='ii'>
ii
2
'Part III,  Work Principles'

你会注意到这些指纹。

代码语言:javascript
复制
<_sre.SRE_Match object; span=(6, 8), match='ii'>
ii
2

...In除了执行替换之外。需要注意的是,它将一个match对象传递给回调函数。然后,您可以找出匹配的内容,并相应地决定用什么替换它。

推广到任意罗马数字

如果您的函数必须匹配任何罗马数字,那么您可以从pass a pattern that finds thosere.sub,但是您的回调大大简化了:

代码语言:javascript
复制
>>> p = r'\bM{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})\b'
>>> string = 'Part viiI,  Work Principles'
>>> re.sub(p, lambda x: x.group().upper(), string, flags=re.IGNORECASE)
'Part VIII,  Work Principles'

现在,您需要做的就是大写匹配的字符串。

票数 2
EN

Stack Overflow用户

发布于 2018-01-12 03:23:50

一种选择是简单地使用re.split,应用str.upper,然后使用str.format

代码语言:javascript
复制
import re
l = ['Part I,   Where I’M Coming From',
'Part Ii,  Life Principles',
'Part Iii, Work Principles']
new_l = [re.split('(?<=Part)\s|,\s+', i) for i in l]
final_l = ['{} {},  {}'.format(a, b.upper(), c) for a, b, c in new_l]

输出:

代码语言:javascript
复制
l = ['Part I,   Where I’M Coming From',
 'Part II,  Life Principles',
 'Part III, Work Principles']
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48218794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档