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

2024-06-17 08:38:01 发布

您现在位置:Python中文网/ 问答频道 /正文

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

结尾处的感叹号和名称是可选的。你知道吗

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作为Nonestop_name作为Radhuspladsen。 如何为它写regex??你知道吗


Tags: namenone参数adminservicelineone例子
2条回答
(?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

我想问题出在最后一部分!你把问号放在括号外,这样它也能在\s+上工作!把它放进去,放在适当的位置,你还必须去掉.{1}末尾的exclaim!sp将其更改为:

'(\s+(?P<exclaim>))?(\s+(?P<stop_name>.+)?)'

演示:http://regex101.com/r/kA8pE8/1

相关问题 更多 >