我想查找特定字符是否在字符串的单词中连续出现,或者查找该单词是否仅包含数字并删除它们。例如,
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])
,但这是删除这里的每一个字。而不是重复的信。
有人可以帮助我解决这些问题吗?
答案 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个以上字母或数字的单词。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 :(得分: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'