我需要用正则表达式解析一行,最后两个参数是可选的。我正在给你一个例子和我写的表达。
最后,惊叹和名字是可选的。
x = re.compile('(?P<stop_id>\d{9})\s*(?P<admin_one>[[\x00-\x7F]{6}|\s{6}])\s*'
'(?P<service_one>[[\x00-\x7F]{3}|\s{3])\s(?P<line_one>.{8})\s*'
'(?P<direction_one>[[\x00-\x7F]{1}|\s{1}])\s*(?P<admin_two>[[\x00-\x7F]{6}|\s{6}])\s*'
'(?P<service_two>[[\x00-\x7F]{3}|\s{3])\s(?P<line_two>.{8})\s*'
'(?P<direction_two>[[\x00-\x7F]{1}|\s{1}])\s*'
'(?P<interchange_time>[[\x00-\x7F]{3}|\s{3}])'
'(\s+(?P<exclaim>).{1})?(\s+(?P<stop_name>.+))?')
当我在其上搜索以下字符串时,
m = x.search('071124127 00006_ 022 94N 1 00006_ 022 83N * 006 Radhuspladsen')
当我执行m.groups()
('071124127', '00006_', '022', '94N ', '1', '00006_', '022', '83N ',
'*', '006', ' R', '', None, None)
我需要exclaim
作为None
和stop_name
作为Radhuspladsen
。
如何为它写regex
?
答案 0 :(得分:1)
(?P<stop_id>\d{9})\s*(?P<admin_one>[[\x00-\x7F]{6}|\s{6}])\s*(?P<service_one>[[\x00-\x7F]{3}|\s{3])\s(?P<line_one>.{8})\s*(?P<direction_one>[[\x00-\x7F]{1}|\s{1}])\s*(?P<admin_two>[[\x00-\x7F]{6}|\s{6}])\s*(?P<service_two>[[\x00-\x7F]{3}|\s{3])\s(?P<line_two>.{8})\s*(?P<direction_two>[[\x00-\x7F]{1}|\s{1}])\s*(?P<interchange_time>[[\x00-\x7F]{3}|\s{3}])(?:\s+(?P<exclaim>.{1}(?=\s)))?(?:\s*(?P<stop_name>.+))?
试试这个。这会给你stop_name
。问题是exclaim
正在吃spaces
所以stop_name
无法获得任何空间开始。我改变了到\s*
,以便它也可以在没有空格的情况下开始。
参见演示。
答案 1 :(得分:1)
我认为问题出在?
的最后一部分!你把问号放在括号之外,这样它就可以在\s+
上运行了!把它放在一个合适的位置,你必须删除.{1}
末尾的exclaim
! sp改为:
'(\s+(?P<exclaim>))?(\s+(?P<stop_name>.+)?)'