假设我有一个文本文件,其中包含一些我希望在常规书面语言中丢失的数据 我想要检索的每个数据都是一个3到0之间的数字元组(我将N1调用到N3),可以用4种不同的方式格式化:
N1-N2-N3
N1N2N3
N1.N2.N3
N1/N2/N3
使用正则表达式,是否可以描述类似的内容:
稍后我会致电separator
的内容是此列表中的内容: [ '-', '', '.', '/' ]
我的表达如下: N1{separator}N2{same_separator_as_the_first_one}N3
?
似乎唯一的表达方式是:
我的表达方式如下: ({N1}-{N2}-{N3}) OR ({N1}{N2}{N3}) OR ({N1}.{N2}.{N3}) OR ({N1}/{N2}/{N3})
......很快变得难以理解......
是否可以使用正则表达式实现第一种表达式?有没有可用的正则表达式允许这种表达方式吗?
真正的问题是:
考虑到可用的格式,编写函数的最佳方法是什么 获取一个字符串并将N1与使用的分隔符一起返回给N3 character(当字符串与any不匹配时抛出异常 格式)?
答案 0 :(得分:4)
这在很大程度上取决于正则表达式的味道,但在一种典型的语言中,我会写:
([1-9]?[0-9])([-./]?)([1-9]?[0-9])\2([1-9]?[0-9])
然后组2是分隔符,组1,3和4是三个数字。
答案 1 :(得分:1)
你的正则表达式应该如下:
N1([-\./])N2\1N3
\1
表示“在第一个括号内匹配的内容”,例如[-\./]
匹配的内容。当然,在非分隔符的情况下,您需要了解更多有关N1和N2的形式以确保匹配。如果你只有“是一个整数”,你可能会遇到困难(N1何时结束,N2何时开始?)。
您正在寻找的东西通常都是所谓的“反向引用”。见这里:http://www.regular-expressions.info/brackets.html。
答案 2 :(得分:0)
在正则表达式的正式定义中,您不能像在“快速不可读”的解决方案中那样,在不枚举它们的情况下使用“相同分隔符作为最后一个”。你需要一个无上下文的语法来“记住”这样的东西;幸运的是(正如其他人所指出的)大多数正则表达式实现包括这样的功能。
答案 3 :(得分:0)
以下是使用Python's Regular Expression库执行此操作的方法:
>>> import re
>>>
>>> text = '''12-34-56
... 654321
... 24.68.10
... 1/86/42
... Nonsense
... 00-000-0000-00000
... '''
>>>
>>> for line in text.split('\n'):
... m = re.match(r'^(\d{1,2})([-/.]?)(\d{1,2})\2(\d{1,2})$', line)
... if m:
... print m.group(1), m.group(3), m.group(4), 'were separated by [', m.group(2), ']'
... else:
... print '[', line, ']', 'was badly-formed'
...
12 34 56 were separated by [ - ]
65 43 21 were separated by [ ]
24 68 10 were separated by [ . ]
1 86 42 were separated by [ / ]
[ Nonsense ] was badly-formed
[ 00-000-0000-00000 ] was badly-formed
[ ] was badly-formed