[英]How to create regex for inline ordered list?
我有一个表单字段,其中大多数只包含内联有序列表:
1. This item may be contain characters, symbols or numbers. 2. And this item also...
以下代码不适用于用户输入验证(用户只能输入内联有序列表):
definiton_re = re.compile(r'^(?:\d\.\s(?:.+?))+$')
validate_definiton = RegexValidator(definiton_re, _("Enter a valid 'definition' in format: 1. meaning #1, 2. meaning #2...etc"), 'invalid')
PS:这里我使用 Django 框架中的RegexValidator类来验证表单字段值。
这是我的解决方案。 它的工作还不错。
input = '1. List item #1, 2. List item 2, 3. List item #3.'
regex = re.compile(r'(?:^|\s)(?:\d{1,2}\.\s)(.+?)(?=(?:, \d{1,2}\.)|$)')
# Parsing.
regex.findall(input) # Result: ['List item #1', 'List item 2', 'List item #3.']
# Validation.
validate_input = RegexValidator(regex, _("Input must be in format: 1. any thing..., 2. any thing...etc"), 'invalid')
validate_input(input) # No errors.
来自 OP 的不错的解决方案。 为了进一步推动它,让我们做一些正则表达式优化/打高尔夫球。
(?<!\S)\d{1,2}\.\s((?:(?!,\s\d{1,2}\.),?[^,]*)+)
以下是新功能:
(?:^|\\s)
与交替之间的回溯匹配。 在这里,我们使用(?<!\\S)
来断言我们不在非空白字符前面。\\d{1,2}\\.\\s
不必在非捕获组内。(.+?)(?=(?:, \\d{1,2}\\.)|$)
太笨重了。 我们将此位更改为:
(
捕获组(?:
(?!
负前瞻:断言我们的位置不是:,\\s\\d{1,2}\\.
逗号、空格字符,然后是列表索引。)
,?[^,]*
这是有趣的优化:*
量词翻转它们,并且没有回溯。(.+?)
的重大改进。)+
继续重复该组,直到否定前瞻断言失败。)
您可以使用它代替另一个答案中的正则表达式,这是一个正则表达式演示!
不过,乍一看,在解析时使用re.split()
可以更好地解决这个问题:
input = '1. List item #1, 2. List item 2, 3. List item #3.';
lines = re.split('(?:^|, )\d{1,2}\. ', input);
# Gives ['', 'List item #1', 'List item 2', 'List item #3.']
if lines[0] == '':
lines = lines[1:];
# Throws away the first empty element from splitting.
print lines;
这是一个在线代码演示。
不幸的是,为了验证,您必须遵循正则表达式匹配方法,只需在楼上编译正则表达式:
regex = re.compile(r'(?<!\S)\d{1,2}\.\s((?:(?!,\s\d{1,2}\.),?[^,]*)+)')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.