python:正则表达式,如何匹配具有结构且以特定组结尾的未定义长度的字符串

python:正则表达式,如何匹配具有结构且以特定组结尾的未定义长度的字符串,python,regex,Python,Regex,我需要创建一个regexp来匹配像这样的字符串999-123-222-…-22 字符串可以由&Ns=(任意数字)完成,也可以不使用此。。。所以对我来说有效的字符串是 999-123-222-...-22 999-123-222-...-22&Ns=12 999-123-222-...-22&Ns=12 以下内容无效: 999-123-222-…-22&N=1 我已经试了好几个小时了。。。但是没有设法解决,确实需要一些帮助如果您只想允许字符串999-123-222-…-22和99

我需要创建一个regexp来匹配像这样的字符串999-123-222-…-22 字符串可以由&Ns=(任意数字)完成,也可以不使用此。。。所以对我来说有效的字符串是

999-123-222-...-22
999-123-222-...-22&Ns=12
999-123-222-...-22&Ns=12
以下内容无效:

999-123-222-…-22&N=1


我已经试了好几个小时了。。。但是没有设法解决,确实需要一些帮助

如果您只想允许字符串
999-123-222-…-22
999-123-222-…-22&Ns=12
您最好使用字符串函数

如果要允许
-
之间的任何数字,可以使用正则表达式:

^(\d+-){3}[.]{3}-\d+(&Ns=\d+)?$
如果数字必须只有3位,最后一个数字只有2位,则可以使用:

^(\d{3}-){3}[.]{3}-\d{2}(&Ns=\d{2})?$

不确定是否要逐字匹配
999-123-22-…-22
,或者是否可以是任何数字/破折号序列。以下是两个不同的正则表达式:

/^[\d-]+(&Ns=\d+)?$/

/^999-123-222-\.\.\.-22(&Ns=\d+)?$/

关键思想是
(&Ns=\d+)?$
部分,它匹配一个可选的
&Ns=
,并锚定到字符串末尾,带有
$

这看起来像一个电话号码和分机信息。。 为什么不让你自己(以及以后必须阅读本文的人)的事情变得更简单,并拆分输入,而不是使用复杂的正则表达式

s = '999-123-222-...-22&Ns=12'
parts = s.split('&Ns=') # splits on Ns and removes it
如果“&”前面的部分是电话号码,您可以进行另一次拆分,并将区号等放入单独的字段中,如:

phone_parts = parts[0].split('-') # breaks up the digit string and removes the '-'
area_code = phone_parts[0]
可以使用string方法isdigit检查在可选“&Ns=”后面找到的部分是否为数字,如果字符串中的所有字符都是数字并且至少有一个字符,则返回true,否则返回false

if len(parts) > 1:
    extra_digits_ok = parts[1].isdigit()