Skip to main content
 首页 » 编程设计

python之Python中可选字段的正则表达式

2024年10月25日32haluo1

我需要用正则表达式解析一行,最后两个参数是可选的。我给你一个例子和我写的表达。

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* 以便它也可以在没有空间的情况下开始。

查看演示。

http://regex101.com/r/dN8sA5/14