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

时间:2014-09-29 06:53:15

标签: python regex

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

最后,

惊叹和名字是可选的。

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

2 个答案:

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

参见演示。

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

答案 1 :(得分:1)

我认为问题出在?的最后一部分!你把问号放在括号之外,这样它就可以在\s+上运行了!把它放在一个合适的位置,你必须删除.{1}末尾的exclaim! sp改为:

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

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