![](/img/trans.png)
[英]python regex keep only words that start with alphabet and continues with [a-zA-Z0-9]
[英]Regex for [a-zA-Z0-9\-] with dashes allowed in between but not at the start or end
这个问题是史诗般的失败,但这是一个有效的解决方案。 这是基于Gumbo的答案(Gumbo接近工作,所以我选择它作为接受的答案):
r'(?=[a-zA-Z0-9\-]{4,25}$)^[a-zA-Z0-9]+(\-[a-zA-Z0-9]+)*$'
我正在使用Python,我不是试图提取值 ,而是测试以确保它符合模式。
spam123-spam-eggs-eggs1
spam123-eggs123
spam
1234
eggs123
eggs1-
-spam123
spam--spam
我只是不能在开始或结束时冲刺。 这里有一个问题是通过在事实之后获取字符串值而在相反方向上工作,但我只需要测试该值以便我可以禁止它。 此外,它最多可以有25个字符长 ,但至少有4个字符长 。 此外, 没有2个破折号可以互相接触 。
这是我在进行一些后观实验后得出的结果:
# 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]+)*$
目前的正则表达式简单易读。 您是否考虑过使用普通的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
它应该是这样的:
^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$
你告诉它只查找一个字符,az,AZ,0-9或 - ,这就是[]的作用。
因此,如果您执行[abc]
您将只匹配“a”,或“b”或“c”。 不是“abc”
玩得开心。
如果您只是想在结尾处开始使用破折号,请尝试^[^-].*?[^-]$
编辑:呸,你不断改变它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.