从输出表达式中排除一个字母的单词

时间:2018-09-28 04:58:04

标签: regex perl

我已经在正则表达式查询中苦苦挣扎了3个多小时。问题是我想按以下方式剪切标点符号。

字符串:"th1s 1s a numer1c2w0rld. Say 'He11o W0r1d!'"

如果我使用正则表达式表达式[^"'\s-]\w*[\d]?\w*[^-!'"\s],它将忽略a。一切都还好。

这是另一次尝试[^"'\s-]\w*[_]{0,2}?\w*[^-!'."\s],但是再次,正则表达式会忽略一个字母的单词。请注意,_是可选的,最多可以有两个下划线。因此,我添加了[_]{0,2}?

的代码

有人可以帮我吗?感谢您的帮助。

我在SO上研究了此主题,发现大多数线程(例如Regular expression to match a whole word or one letter主要处理连续单词。我的单词是密码类型的。意思是,他们可能在单词中包含数字数据。例如。 th1s甚至是numer1cw0rld


所需的输出是以下单词的字符串。

th1s 
1s 
a 
numer1c2__w0rld
numeric_world
Say
trHe11o 
W0r1d

其他说明:单词中不允许使用空格。这就是为什么我在正则表达式中添加\s的原因。

其他说明:单词不能以_结尾或开头。但是,“ abcd_efgh”有效。

5 个答案:

答案 0 :(得分:4)

如果您对_开头和结尾都没问题,则只需使用以下内容:

\w+

如果您根本不需要_,只需使用以下命令即可

[^\W_]+    # Like \w, but doesn't match "_"

因此您可以使用以下内容:

[^\W_] \w* [^\W_] | [^\W_]

我们可以排除[^\W_]

[^\W_] (?: \w* [^\W_] )?

也就是说,将您要匹配的内容看作是由下划线(例如wordword_wordword_word_word等)组成的一堆“单词”,这样更高效减少失败比赛的回溯。因此,我们得到以下信息:

[^\W_]+ (?: _+ [^\W_]+ )*          # Or  [^\W_]+ (?: _{1,2} [^\W_]+ )*

(删除空格或使用/x。)

答案 1 :(得分:1)

这应该可以按预期工作:-

([^-_"'\s][-]?\w*[^-_!'."\s]|[a-z]+)

答案 2 :(得分:1)

也许列出所有不允许使用的标点符号/空格字符的简单否定集合就可以工作(处理一个字母“ words”就可以,但排除字符除外)。

例如,匹配感叹号,单引号,双引号,句号或空格(因此,除了字母数字之外,还允许连字符,下划线等)中任何一个或多个字符的匹配项:

[^'"\!\.\s]+

编辑(对于单词不能以下划线或连字符开头或结尾的附加要求):

此字符与感叹号,单引号,双引号,句号或空格(除字母数字之外,还允许连字符,下划线等)匹配的任何字符中的一个或多个(因此,除了字母数字之外,还允许连字符,下划线等),但不包括以或开头下划线或连字符(使用管道运算符作为替代表达式来处理单个字符匹配)。

[^_'"\!\-\.\s][^'"\!\.\s]*[^_'"\!\-\.\s]|[^_'"\!\-\.\s]

此外,为避免对以后的读者造成混淆,发布的问题没有提及连字符(该要求仅在注释中注明),因此这里有一些正则表达式假定匹配项中不应包含连字符。

[^_'"\!\-\.\s][^'"\!\-\.\s]*[^_'"\!\-\.\s]|[^_'"\!\-\.\s]

也就是说,请参见@ikegami中更为优雅的答案,该答案还可以防止与其他非单词字符(例如逗号,括号等)匹配。

答案 3 :(得分:0)

如果您想删除标点符号,可以使用以下更简单的方法:

import string
punc = string.punctuation
a = "th1s 1s a numer1c2w0rld. Say 'He11o W0r1d!'"
a_mod = "".join([x for x in a if x not in punc]).split(" ")

答案 4 :(得分:0)

a = "th1s 1s a numer1c2w0rld. S_ay 'He11o W0r1d!'"    
re.findall('([a-zA-Z0-9]([a-zA-Z0-9]*[-_]{0,2}[a-zA-Z0-9]*)?)', a)

输出

['th1s', '1s', 'a', 'numer1c2w0rld', 'S_ay', 'He11o', 'W0r1d']