python:正则表达式,如何匹配具有结构且以特定组结尾的未定义长度的字符串
我需要创建一个regexp来匹配像这样的字符串999-123-222-…-22 字符串可以由&Ns=(任意数字)完成,也可以不使用此。。。所以对我来说有效的字符串是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
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()