5

为字符串编写 python 正则表达式。我希望字符串至少为 1 个符号,最多为 30 个。问题是我在正则表达式字母中使用了 3 个子块,所以总是必须有 3 个字符的长度。是否可以在此正则表达式中添加该条件(1-30 个字符长度):

regex = re.compile("^[a-zA-Z]+[a-zA-Z0-9\.\-]+[a-zA-Z0-9]$")
r = regex.search(login)

谢谢你。

4

2 回答 2

8

虽然尚不清楚您要接受哪个 1 或 2 个长度的字符串,但我建议使用以下正则表达式:

regex = re.compile("^[a-zA-Z][a-zA-Z0-9\.\-]{0,28}[a-zA-Z0-9]$")

由于中间集包括所有其他,这将直接匹配所有长度为 3-30 的单词,如您所愿。

我希望这个正则表达式也匹配你的 2 个长度的字符串(我只是假设第一个字符必须是一个字母),你需要添加一些东西(使用 '|')来匹配单个字母。

于 2013-08-15T13:36:03.293 回答
1

一般来说,这很困难,并且通常需要在 RE 之外做一些工作(如 M. Buettner 的评论中所建议的)。您的问题更容易,因为它可以简化为只有一个重复元素的模式。

您有一个或多个字母,后跟一个或多个(字母、数字、点、连字符),然后是一个(字母或数字),对吗?如果是这样,则不需要重复第一组。离开+得到

r"^[a-zA-Z][a-zA-Z0-9\.\-]+[a-zA-Z0-9]$"

并且您将匹配完全相同的字符串集。任何超过第一个的额外前导字母将在第二组而不是第一组中匹配。

现在,RE 的唯一可变部分是中间部分。要将总长度限制为 30,您只需将中间部分限制为 28 个字符。将 + 更改为 {1,28} 以获得:

r"^[a-zA-Z][a-zA-Z0-9\.\-]{1,28}[a-zA-Z0-9]$"

您可以在以下位置阅读有关 Python RE 的更多信息:

http://docs.python.org/2/library/re.html

于 2013-08-15T13:51:24.420 回答