正则表达式在单词中找到连续字符并删除单词

时间:2016-09-09 19:37:39

标签: python regex r python-2.7 python-3.x

我想查找特定字符是否在字符串的单词中连续出现,或者查找该单词是否仅包含数字并删除它们。例如,

df
All aaaaaab the best 8965
US issssss is 123 good 
qqqq qwerty 1 poiks
lkjh ggggqwe 1234 aqwe iphone5224s

我想检查两个条件,在第一个条件中检查重复字符超过3次,并检查一个单词是否只包含数字。我只想在单词仅包含数字时以及单词在单词中连续出现3次以上时删除。

以下应该是输出,

df
All the best 
US is good 
qwerty poiks
lkjh aqwe iphone5224s

以下是我的尝试,

re.sub('r'\w[0-9]\w*', df[i])号码。但这并不是删除单个字符数字。同样对于重复的角色,我试过re.sub('r'\w[a-z A-Z]+[a-z A-Z]+[a-z A-Z]+[a-z A-Z]\w*', df[i]),但这是删除这里的每一个字。而不是重复的信。

有人可以帮助我解决这些问题吗?

2 个答案:

答案 0 :(得分:1)

我建议

\s*\b(?=[a-zA-Z\d]*([a-zA-Z\d])\1{3}|\d+\b)[a-zA-Z\d]+

请参阅regex demo

只有字母数字与此模式匹配:

  • \s* - 零个或多个空格
  • \b - 字边界
  • (?=[a-zA-Z\d]*([a-zA-Z\d])\1{3}|\d+\b) - 单词中必须至少有4个重复的连续字母或数字或整个单词必须只包含数字
  • [a-zA-Z\d]+ - 一个包含1个以上字母或数字的单词。

Python demo:

import re
p = re.compile(r'\s*\b(?=[a-z\d]*([a-z\d])\1{3}|\d+\b)[a-z\d]+', re.IGNORECASE)
s = "df\nAll aaaaaab the best 8965\nUS issssss is 123 good \nqqqq qwerty 1 poiks\nlkjh ggggqwe 1234 aqwe iphone5224s"
strs = s.split("\n")                   # Split to test lines individually
print([p.sub("", x).strip() for x in strs])
# => ['df', 'All the best', 'US is good', 'qwerty poiks', 'lkjh aqwe iphone5224s']

请注意,strip()将删除字符串开头的剩余空格。

R中使用TRE正则表达式的类似解决方案:

x <- c("df", "All aaaaaab the best 8965", "US issssss is 123 good ", "qqqq qwerty 1 poiks", "lkjh ggggqwe 1234 aqwe iphone5224s")
p <- " *\\b(?:[[:alnum:]]*([[:alnum:]])\\1{3}[[:alnum:]]*|[0-9]+)\\b"
gsub(p, "", x)

查看demo

模式详细信息demo

  • \s* - 0+ whitespaces
  • \b - 领先的单词边界
  • (?:[[:alnum:]]*([[:alnum:]])\1{3}[[:alnum:]]*|[0-9]+) - 两种选择中的任何一种:
    • [[:alnum:]]*([[:alnum:]])\1{3}[[:alnum:]]* - 0+字母数字后跟相同的4个字母数字字符,后跟0 +字母数字
    • | - 或
    • [0-9]+ - 一位或多位
  • \b - 尾随字边界

更新:

要添加一个选项以删除您可以使用的单字母单词

  1. R (将[[:alpha:]]|添加到更改组):\s*\b(?:[[:alpha:]]|[[:alnum:]]*([[:alnum:]])\1{3}[[:alnum:]]*|[0-9]+)\b(请参阅demo
  2. Python 基于正则表达式的正则表达式(add [a-zA-Z]\b|到前瞻组):*\b(?=[a-zA-Z]\b|\d+\b|[a-zA-Z\d]*([a-zA-Z\d])\1{3})[a-zA-Z\d]+

答案 1 :(得分:0)

数字很简单:

re.sub(r'\d+', '', s)

如果要删除同一个字母出现两次的单词,可以使用捕获组(请参阅https://docs.python.org/3/library/re.html):

re.sub(r'\w*(\w)\1\w*', '', s)

把它们放在一起:

re.sub(r'\d+|\w*(\w)\1\w*', '', s)

例如:

>>> re.sub(r'\d+|\w*(\w)\1\w*', '', 'abc abbc 123 a1')
'abc   a'

之后您可能需要使用以下内容清理空格:

>>> re.sub(r' +', ' ', 'abc   a')
'abc a'