我需要用正则表达式解析一行,最后两个参数是可选的。我给你一个例子和我写的表达。
exclaim 和 name 是可选的。
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。 如何为它编写正则表达式??
请您参考如下方法:
(?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* 以便它也可以在没有空间的情况下开始。
查看演示。
