我已经在正则表达式查询中苦苦挣扎了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”有效。
答案 0 :(得分:4)
如果您对_
开头和结尾都没问题,则只需使用以下内容:
\w+
如果您根本不需要_
,只需使用以下命令即可
[^\W_]+ # Like \w, but doesn't match "_"
因此您可以使用以下内容:
[^\W_] \w* [^\W_] | [^\W_]
我们可以排除[^\W_]
。
[^\W_] (?: \w* [^\W_] )?
也就是说,将您要匹配的内容看作是由下划线(例如word
,word_word
,word_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']