Python 正则表达式以查找其每个奇偶字符都是某个字符的表达式

Python 正则表达式以查找其每个奇偶字符都是某个字符的表达式,python,regex,Python,Regex,我想检查一个字符串的组成是否使得每一个字符都是e(或空格),从索引0或1中的任何一个开始 我对正则表达式很不熟悉,甚至可以从它开始 接受的字符串: Aebece Aebec eAebec eAebece e eAe Aeb 拒绝 A Ab Aeeb Aeee ee eee eeAebec eA Aaebbecce Aaebbecc (And so on, meaning each of a,b,c can NOT be a word of any length not containin

我想检查一个字符串的组成是否使得每一个字符都是
e
(或空格),从索引0或1中的任何一个开始

我对正则表达式很不熟悉,甚至可以从它开始

接受的字符串:

Aebece
Aebec
eAebec
eAebece
e
eAe
Aeb


拒绝

A
Ab
Aeeb
Aeee
ee
eee
eeAebec
eA

Aaebbecce
Aaebbecc
(And so on, meaning each of a,b,c can NOT be a word of any length not containing `e`, but has to be a single character)
我相信这就是它的定义,但肯定有人会遇到我没有想到的edge案例

为了视觉上的方便,我用“e”代替了空格。
在简单的英语中,这是为了捕捉“空格分隔的单词”,例如 “W W W”、“S W E T”等,但不包括“H o L Y S M o K E S”等句子(注意双空格)


我希望这是清楚的。

一种更简单的方法是在两个单独的数组中提取偶数和奇数字符,折叠数组,并验证其长度:

''.join(set("H O L Y S M O K E S"[1::2])) (without double space)
返回“”一个空格

''.join(set("H O L Y  S M O K E S"[1::2])) (without double space)
返回“EKMOS”

问题在于多字节字符,当“[1::2]”技巧不起作用时(我认为它对正则表达式也不起作用,因为
re.findall(r'(.),“Cioè”)
产生
['C','I','o','\xc3','\xa8']
而不是
['C','I','o','è]

正则表达式 如果需要正则表达式,则:

^(?:(?:[ e].)*[ e]?|(?:.[ e])*.?)$
这意味着在字符串的开头和结尾之间必须有一个
(?:[e])*[e]?
(一个“空格/e加任何东西”对),重复,可选地后跟一个空格/e);或
(?:[e])*。?
,一个后跟空格/e的任意字符,可能重复,可选地后跟一个字符

这并不完全等同于您的请求,因为它将接受一个用空格分隔的单词,e的“HeOeL Y s M O K EeS”是好的。要拥有所有空格或所有e,您需要

^(?:(?: .)* ?|(?:. )*.?)|(?:.e)*.?)|(?:e.)e?)$

要覆盖这四种情况(从0开始的空格分隔、从1开始的空格分隔、从0开始的e分隔和从1开始的e分隔)。

一种更简单的方法是在两个单独的数组中提取偶数和奇数字符,折叠数组,并验证其长度:

''.join(set("H O L Y S M O K E S"[1::2])) (without double space)
返回“”一个空格

''.join(set("H O L Y  S M O K E S"[1::2])) (without double space)
返回“EKMOS”

问题在于多字节字符,当“[1::2]”技巧不起作用时(我认为它对正则表达式也不起作用,因为
re.findall(r'(.),“Cioè”)
产生
['C','I','o','\xc3','\xa8']
而不是
['C','I','o','è]

正则表达式 如果需要正则表达式,则:

^(?:(?:[ e].)*[ e]?|(?:.[ e])*.?)$
这意味着在字符串的开头和结尾之间必须有一个
(?:[e])*[e]?
(一个“空格/e加任何东西”对),重复,可选地后跟一个空格/e);或
(?:[e])*。?
,一个后跟空格/e的任意字符,可能重复,可选地后跟一个字符

这并不完全等同于您的请求,因为它将接受一个用空格分隔的单词,e的“HeOeL Y s M O K EeS”是好的。要拥有所有空格或所有e,您需要

^(?:(?: .)* ?|(?:. )*.?)|(?:.e)*.?)|(?:e.)e?)$

为了涵盖这四种情况(从0开始的空格分隔、从1开始的空格分隔、从0开始的e分隔和从1开始的e分隔)。

我认为您的请求可能不一致。 允许的字符串

A_B_C
A_B_C_
_A_
_A_B_C
但不允许出现以下情况:

A
_A
从模式的角度来看,
a
a\u B\u C
非常相似,
\u a
\u a\u B\u C
非常相似。 同时包括
A
\u A
我能想到的最好的正则表达式是

^\s?(?:\w\s)*[\w\s]?$
换句话说:字符串开头、0或1个空格、0或多个字符空格块,后跟单个字符或单个空格,后跟字符串结尾

您还可以检查它是否与
^\s{0,1}\w$
不匹配,以排除上述两种情况,如果这确实是您的意图。它还与_uu匹配,因此还需要检查字符串是否正好是2个空格字符

[更新]

评论中有一个很好的regexp,效果很好-(全部归功于Toto)

[更新2]

此选项还匹配任意的whit空格和字母:

^(?!\s\s(?<!\n))(?!\s?\w$)\s?(?:\w\s)*[\w\s]?$

^(?!\s\s(?我认为您的请求可能不一致。
允许的字符串

A_B_C
A_B_C_
_A_
_A_B_C
但不允许出现以下情况:

A
_A
从模式的角度来看,
a
a\u B\u C
非常相似,
\u a
\u a\u B\u C
非常相似。 同时包括
A
\u A
我能想到的最好的正则表达式是

^\s?(?:\w\s)*[\w\s]?$
换句话说:字符串开头、0或1个空格、0或多个字符空格块,后跟单个字符或单个空格,后跟字符串结尾

如果您真的想排除上述两种情况,您可以另外检查它是否与
^\s{0,1}\w$
不匹配。它还与_u匹配,因此您还需要检查字符串是否正好是两个空格字符

[更新]

评论中有一个很好的regexp,效果很好-(全部归功于Toto)

[更新2]

此选项还匹配任意的whit空格和字母:

^(?!\s\s(?<!\n))(?!\s?\w$)\s?(?:\w\s)*[\w\s]?$

^(?!\s\s(?)我想你必须分别做偶数和奇数。作为起点:“^(.e)+$”^e(([^e]e)+[^e]?)?$如果允许单个
e
,那么
eA
也应该被允许吗?这是你想要的吗?可以吗?我认为你必须分别做偶数和奇数。作为起点:“^(.e)+$”^e([^e]e)++[^e]?)?$如果允许使用单个
e
,那么
eA
也应该允许吗?这是您想要的吗?可以吗?谢谢!这非常有用,但我不想仅限于英语。我如何将其扩展到适用于任何字符(空格或
e
分隔)?\s已匹配任何空格,\w任何类似的单词。我的版本已匹配特殊字符,请参阅:。@Gulzar请参阅更新2接受@LSerni的答案,因为我发现它更具可读性。我感到很遗憾,因为两者都是正确的。但我只能选择一个:(谢谢!这是非常有用的,但是我不想只限于英语。我怎样才能将它扩展到适用于任何ch