找到单词中连续字符的正则表达式并移除该单词

2024-09-29 01:33:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我想找出一个特定的字符是否连续出现在字符串的a字中,或者找出这个字是否只包含数字,并将其删除。例如

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

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

以下是输出结果

^{pr2}$

以下是我的尝试

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]),但这会删除这里的每个单词。而不是重复的字母。在

有谁能帮我解决这些问题吗?在


Tags: the字符串redfis数字all条件
2条回答

数字很简单:

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

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

^{pr2}$

把它们放在一起:

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'

我建议

\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:

^{pr2}$

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

R中的一个类似的解决方案是TRE regex:

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+个空格
  • \b-前导词边界
  • (?:[[:alnum:]]*([[:alnum:]])\1{3}[[:alnum:]]*|[0-9]+)-两种选择之一:
    • [[:alnum:]]*([[:alnum:]])\1{3}[[:alnum:]]*-0+个字母数字,后跟相同的4个字母数字字符,然后是0+字母数字字符
    • |-或
    • [0-9]+-1个或更多个数字
  • \b-尾随词边界

更新:

若要同时添加一个选项以删除可能使用的单字母单词,请执行以下操作:

  1. R(将[[:alpha:]]|添加到交替组):\s*\b(?:[[:alpha:]]|[[:alnum:]]*([[:alnum:]])\1{3}[[:alnum:]]*|[0-9]+)\b(参见demo
  2. Python基于lookaround的regex(add[a-zA-Z]\b|到lookahead组):*\b(?=[a-zA-Z]\b|\d+\b|[a-zA-Z\d]*([a-zA-Z\d])\1{3})[a-zA-Z\d]+

相关问题 更多 >