python添加横线代码,正则表达式替换Python中由下划线分隔的单词

很好的问题。问题是:

re.sub

不允许一个字符位于多个匹配组中;一旦某个字符属于某个匹配项,则会使用该字符,除非指定该匹配项为非匹配项。当使用星号进行匹配时,一个关键事实是单词边界位于星号和单词字符之间。下面是使用星号(the

{0}

{1}

,和

{2}

lambda

('', 'first', '*')

('', 'second', '*')

('', 'third', '*')

('', 'fourth', '*')

('', 'fifth', '')

当regex匹配器到达第一个匹配的末尾时,其光标位于第一个星号和单词之间

second

,这是一个词的边界。因此

second*

third*

等等。

但是,当使用下划线时,以下是相应的匹配项:

('', 'first', '_')

('_', 'third', '_')

('_', 'fifth', '')

当regex匹配器到达第一个匹配的末尾时,其光标位于第一个下划线和单词之间

,这是

一个词的界限。因为它已经传递了第一个下划线并且不在单词边界处,所以它不能匹配

(_|\b)second

第二

,并且您可以看到,该匹配包括

third

简而言之,第一个例子是“幸运”的,因为在传递分隔符字符之后,您将在单词边界中着陆,而第二个例子不是这样。

要解决这个问题,可以使用前瞻断言,它不会使用匹配的字符。

def replace_words(string, rep_dict, separator):

regex = r'({0}|\b)({1})((?={2}|\b).*?)'.format(

re.escape(separator), '|'.join(rep_dict.keys()), re.escape(separator)

)

return re.sub(

regex, lambda x: '{0}{1}{2}'.

format(x.group(1), rep_dict[x.group(2)], x.group(3)), string

)

('', 'first', '')

('*', 'second', '')

('*', 'third', '')

('*', 'fourth', '')

('*', 'fifth', '')

忽略下面的横线文本,这些文本会在单词前缀上匹配,例如。

*firstperson*

会变成

*1stperson*

P、 你最好的选择是分裂和重新加入美国。无论如何,这很可能是re.sub在幕后所做的,因为字符串是不可变的。

要解决此问题,只能在关键字前面的分隔符上进行匹配

字符串的结尾)。

def replace_words(string, rep_dict, separator):

regex = r'(^|{0})({1})'.format(

re.escape(separator), '|'.join(rep_dict.keys())

)

return re.sub(

regex, lambda x: print(x.groups()) or '{0}{1}'.

format(x.group(1), rep_dict[x.group(2)]), string

)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值