python - 如何为内联有序列表创建正则表达式?

标签 python regex django

我有一个表单字段,其中大多数仅包含内联有序列表:

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:这里我使用RegexValidator Django 框架中的类用于验证表单字段值。

最佳答案

Nice solution from OP.为了进一步插入它,让我们做一些正则表达式优化/打高尔夫球。

(?<!\S)\d{1,2}\.\s((?:(?!,\s\d{1,2}\.),?[^,]*)+)

以下是新内容:

  • (?:^|\s)比赛之间有回溯交替。这里我们使用(?<!\S)相反,断言我们不在非空白字符前面。
  • \d{1,2}\.\s不必位于非捕获组内。
  • (.+?)(?=(?:, \d{1,2}\.)|$)太笨重了。我们将这一点更改为:
    • ( 捕获组
    • (?:
    •     (?!消极前瞻:断言我们的立场是NOT:
    •       ,\s\d{1,2}\.一个逗号、空格字符,然后是列表索引。
    •     )
    •     ,?[^,]*这是有趣的优化:
      • 如果有逗号,我们会匹配一个逗号。因为我们从前瞻断言中知道该位置不会启动新的列表索引。因此,我们可以安全地假设非逗号序列的剩余位(如果有的话)与下一个元素无关,因此我们用 * 滚动它们。量词,并且没有回溯。
      • 这比 (.+?) 有显着改进.
    • )+继续重复该组,直到否定先行断言失败。
    • )

您可以使用它来代替 the other answer 中的正则表达式,这是 regex demo !

<小时/>

不过,乍一看,这个问题用 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;

这是一个online code demo .

不幸的是,为了进行验证,您必须遵循正则表达式匹配方法,只需编译楼上的正则表达式即可:

regex = re.compile(r'(?<!\S)\d{1,2}\.\s((?:(?!,\s\d{1,2}\.),?[^,]*)+)')

关于python - 如何为内联有序列表创建正则表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25343256/

相关文章:

python - Django 原始 SQL 查询与外键

python - 是否有一个Python函数在循环内,在到达列表的最后一个索引后,它将再次转到第一个索引,然后循环重新启动?

正则表达式。匹配模式后如何从结果中排除子字符串

regex - 如何通过 perl 和 regex 验证一个字符串只包含某些字母

python - 绘制具有不同日期的两个时间序列的值

python - 如何识别数据框中与前一行相比的行中的字符串变化?

python - 不要替换 python 中包含撇号或 & 的单词

python - Django 搜索 : Setting Haystack_Default_Operator = 'OR' has no effect

python - Django:无法更改默认语言

python - 哪种技术更适合构建基于 Web 的 GUI 客户端?