Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python [a-zA-Z0-9\-]的正则表达式,中间允许有破折号,但不能在开头或结尾 更新:_Python_Regex - Fatal编程技术网

Python [a-zA-Z0-9\-]的正则表达式,中间允许有破折号,但不能在开头或结尾 更新:

Python [a-zA-Z0-9\-]的正则表达式,中间允许有破折号,但不能在开头或结尾 更新:,python,regex,Python,Regex,这个问题是一个巨大的失败,但这里有一个有效的解决方案。这是基于Gumbo的答案(Gumbo的答案接近有效,所以我选择它作为公认的答案): 解决方案: 原始问题(尽管经过3次编辑) 我正在使用Python,并不是试图提取值,而是测试以确保它符合模式 允许值: 不允许的值: 我只是不能在开始或结束时冲刺。有一种方法的作用方向相反,即在事实发生后获取字符串值,但我只需要测试该值,这样我就可以不允许它。此外,它可以最大长度为25个字符,但最小长度为4个字符。而且,没有两个破折号可以相互接触 以下是我在做

这个问题是一个巨大的失败,但这里有一个有效的解决方案。这是基于Gumbo的答案(Gumbo的答案接近有效,所以我选择它作为公认的答案):

解决方案: 原始问题(尽管经过3次编辑) 我正在使用Python,并不是试图提取值,而是测试以确保它符合模式

允许值: 不允许的值: 我只是不能在开始或结束时冲刺。有一种方法的作用方向相反,即在事实发生后获取字符串值,但我只需要测试该值,这样我就可以不允许它。此外,它可以最大长度为25个字符,但最小长度为4个字符。而且,没有两个破折号可以相互接触

以下是我在做了一些“回头看”等实验后得出的结论:

# Nothing here

请尝试以下正则表达式:

^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$
此正则表达式只允许连字符分隔
[a-zA-Z0-9]
的一个或多个字符的序列


编辑跟进您的评论:表达式
(…)*
允许组内的部分重复零次或多次。这意味着

a(bc)*

a|abc|abcbc|abcbcbc|abcbcbcbc|…

编辑现在您更改了要求:因为您可能不想限制单词中每个以连字符分隔的部分的长度,所以需要考虑长度:

(?=[a-zA-Z0-9-]{4,25}$)^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$

应该是这样的:

^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$
您告诉它只查找一个字符,a-z、a-z、0-9或-,这就是[]所做的

因此,如果您选择了
[abc]
,您将只匹配“a”或“b”或“c”。不是“abc”


玩得开心。

如果你只是不想在结尾和开头加个破折号,试试
^[^-].?[^-]$


编辑:呸,你一直在改变它

当前正则表达式简单易读。您是否考虑过使用普通Python字符串处理工具应用其他约束,而不是使其变得冗长和复杂

import re

def fits_pattern(string):
    if (4 <= len(string) <= 25 and
        "--" not in string and
        not string.startswith("-") and
        not string.endswith("-")):

        return re.match(r"[a-zA-Z0-9\-]", string)
    else:
        return None
重新导入
def fits_模式(字符串):

if(比我快4-24秒!旁白:您不允许连续破折号,并忽略OP要求的{4,25}长度限制(在第一次阅读问题时我也错过了…)@orokusaki:the
*
量词允许组内的部分
(…)
重复零次或多次。这意味着不可能重复。@ephemient:你没有错过它们,OP后来添加了它们。并且一直在添加内容(没有连续的破折号)。@orokusaki:你开始时说“任何由字母或破折号组成的东西,除了开始或结束不能是破折号”。然后你添加了
{4,25}
要求。然后您添加了“无两个连续破折号”。您最初的示例中没有一个显示您添加的内容。@orokusaki:啊,您是对的,谢谢!但是如果在字符类的开头或结尾以及字符类之外使用连字符,则根本不需要转义。您介意在发布之前实际完成您的答案吗?继续添加约束是不礼貌的(最少4个字符,最多25个)在人们开始回答您的问题后。您提到的最少4个字符,但在您的示例中包括“123”作为一个允许的值。应该在“不允许”列中吗?您的描述中没有任何地方说您只允许字母、数字和破折号。此外,您一直在更改问题。如何让任何人回答这个问题而不获得否决票?结尾处的附加
[a-zA-Z0-9]+
不是必需的;
(\-[a-zA-Z0-9]+)*
已经涵盖了这一点。@Gumbo谢谢,我误解了这一部分,但现在我把它解读为(任何由
alnum
进行的破折号,以及此模式的零次或多次重复)。事实上,它不仅没有必要,而且实际上工作不正确。如果对该re搜索字符串
i-am-string-number-5
,它将返回
None
,因为只有足够的量可以被正则表达式的连字符模式吃掉。谢谢你的帮助。我已经编辑了我的解决方案。@jpabluz我只放了该reGEX在标题中显示允许的字符。当然,我将使用+或*,但我想演示哪些字符是允许的。@ Syic,只是澄清,但它总是只允许字母,数字和破折号在中间。它仍然没有说任何地方在你的描述。公平地说,它一直在标题中说。不是放置需求的最佳位置,但你们已经做到了……这可能有点过火,因为并没有将其放入正则表达式中,但总体思路值得考虑。正如一句老话所说:有些人在遇到问题时,会认为“我知道,我将使用正则表达式”。现在他们有两个问题。
(?=[a-zA-Z0-9-]{4,25}$)^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$
^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$
import re

def fits_pattern(string):
    if (4 <= len(string) <= 25 and
        "--" not in string and
        not string.startswith("-") and
        not string.endswith("-")):

        return re.match(r"[a-zA-Z0-9\-]", string)
    else:
        return None