首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python查找所有出现的连字符并在位置替换

Python查找所有出现的连字符并在位置替换
EN

Stack Overflow用户
提问于 2019-06-04 16:39:12
回答 4查看 675关注 0票数 2

我必须用连字符(如c-c-c-c-comeoh-oh-oh-oh等)替换所有出现的模式,在本例中使用最后一个令牌,即comeoh,其中

  • 连字符之间的字符数是任意的,可以是一个或多个字符。
  • 匹配的令牌是连字符中的最后一个令牌,因此comec-c-come中。
  • 输入字符串可能出现一个或多个类似于以下句子的情况: c-c-c-c-come to home today c-c-c-c-come to me oh-oh-oh-oh it's a bad life oh-oh-oh-oh
  • 需要通过finditer找到匹配令牌的开始和结束位置 R= re.compile(pattern,flags=re.I欧元re.X \ re.UNICODE)用于r.finditer(Text)中的m: word=m.group() characterOffsetBegin=m.start() characterOffsetEnd=m.end() #现在替换和存储索引

更新

假设这些连字符词不属于固定的字典,我将在其中添加以下约束:

  • 连字符之间的字符数必须从最小到最大,如{1,3},以便捕获组必须匹配c-comec-c-come,而不是像fine-tuninginter-face之类的连字符实数。
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-06-04 16:59:33

使用捕获组和反向引用的选项可能是:

代码语言:javascript
复制
(?<!\S)(\w{2,3})(?:-\1)*-(\w+)(?!\S)

与此相匹配:

  • (?<!\S)负查找,断言左边的不是非空格字符
  • 第1组中的(\w{2,3})捕获一个单词字符2次或3次
  • (?:-\1)*重复0+次数匹配连字符,然后反向引用第1组中匹配的内容
  • -(\w+)匹配-,然后匹配第2组中的1+单词字符
  • (?!\S)负前瞻,断言右边的不是非空格字符

在替换中使用第二个捕获组\\2r'\2

Regex演示 x- Python演示

例如

代码语言:javascript
复制
import re

text = "c-c-c-c-come oh-oh-oh-oh it's a bad life oh-oh-oh-oh"
pattern = r"(?<!\S)(\w{1,3})(?:-\1)*-(\w+)(?!\S)"
text = re.sub(pattern, r'\2', text)
print(text)

结果

代码语言:javascript
复制
come oh it's a bad life oh
票数 1
EN

Stack Overflow用户

发布于 2019-06-04 16:46:06

只需使用re.sub()替换所有索引,而不必对匹配的索引进行迭代:

代码语言:javascript
复制
import re

s = 'c-c-c-c-come to home today c-c-c-c-come to me'

print(re.sub(r'(\w+(?:-))+(\w+)', '\\2', s))
# come to home today come to me
票数 3
EN

Stack Overflow用户

发布于 2019-06-04 16:48:31

这里有一个可能的表达式:

代码语言:javascript
复制
import re

text = ("c-c-c-c-come to home today c-c-c-c-come to me, "
        "oh-oh-oh-oh it's a bad life oh-oh-oh-oh")
pattern = r"(?<=-)\w+(?=[^-\w])"
r = re.compile(pattern, flags=re.I | re.X | re.UNICODE)
for m in r.finditer(text):
    word = m.group()
    characterOffsetBegin = m.start()
    print(word, characterOffsetBegin)

输出:

代码语言:javascript
复制
come 8
come 35
oh 56
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56448068

复制
相关文章

相似问题

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