Python 中与 finditer() 的重叠匹配

2024-01-09

我正在使用正则表达式来匹配文本中的圣经经文引用。当前的正则表达式是

REF_REGEX = re.compile('''
  (?<!\w)                        # Not preceded by any words
  (?P<quote>q(?:uote)?\s+)?      # Match optional 'q' or 'quote' followed by many spaces
  (?P<book>                           
    (?:(?:[1-3]|I{1,3})\s*)?     # Match an optional arabic or roman number between 1 and 3.
    [A-Za-z]+                    # Match any alphabetics
  )\.?                           # Followed by an optional dot
  (?:                         
    \s*(?P<chapter>\d+)          # Match the chapter number
    (?:
      [:\.](?P<startverse>\d+)   # Match the starting verse number, preceded by ':' or '.'
        (?:-(?P<endverse>\d+))?  # Match the optional ending verse number, preceded by '-'
    )?                           # Verse numbers are optional
  )
  (?:
    \s+(?:                       # Here be spaces
      (?:from\s+)|(?:in\s+)|(?P<lbrace>\())   # Match 'from[:space:]', 'in[:space:]' or '('
      \s*(?P<version>\w+)        # Match a word preceded by optional spaces
      (?(lbrace)\))              # Close the '(' if found earlier
  )?                             # The whole 'in|from|()' is optional
  ''', re.IGNORECASE | re.VERBOSE | re.UNICODE)

这可以很好地匹配以下表达式:

"jn 3:16":                           (None, 'jn', '3', '16', None, None, None),
"matt. 18:21-22":                    (None, 'matt', '18', '21', '22', None, None),
"q matt. 18:21-22":                  ('q ', 'matt', '18', '21', '22', None, None),
"QuOTe jn 3:16":                     ('QuOTe ', 'jn', '3', '16', None, None, None),
"q 1co13:1":                         ('q ', '1co', '13', '1', None, None, None), 
"q 1 co 13:1":                       ('q ', '1 co', '13', '1', None, None, None),
"quote 1 co 13:1":                   ('quote ', '1 co', '13', '1', None, None, None),
"quote 1co13:1":                     ('quote ', '1co', '13', '1', None, None, None),
"jean 3:18 (PDV)":                   (None, 'jean', '3', '18', None, '(', 'PDV'),
"quote malachie 1.1-2 fRom Colombe": ('quote ', 'malachie', '1', '1', '2', None, 'Colombe'),
"quote malachie 1.1-2 In Colombe":   ('quote ', 'malachie', '1', '1', '2', None, 'Colombe'),
"cinq jn 3:16 (test)":               (None, 'jn', '3', '16', None, '(', 'test'),
"Q   IIKings5.13-58   from   wolof": ('Q     ', 'IIKings', '5', '13', '58', None, 'wolof'),
"This text is about lv5.4-6 in KJV only": (None, 'lv', '5', '4', '6', None, 'KJV'),

但它无法解析:

"Found in 2 Cor. 5:18-21 ( Ministers":                    (None, '2 Cor', '5', '18', '21', None, None),

因为它返回(None, 'in', '2', None, None, None, None)反而。

有没有办法让 finditer() 返回所有匹配项,即使它们重叠,或者有没有办法改进我的正则表达式,使其正确匹配最后一点?

Thanks.


消耗的字符已被消耗,您不应该要求正则表达式引擎返回。

从你的例子来看,诗句部分(例如:1)似乎不是可选的。删除它将匹配最后一位。

ref_regex = re.compile('''
(?<!\w)                      # Not preceeded by any words
((?i)q(?:uote)?\s+)?            # Match 'q' or 'quote' followed by many spaces
(
    (?:(?:[1-3]|I{1,3})\s*)?    # Match an arabic or roman number between 1 and 3.
    [A-Za-z]+                   # Match many alphabetics
)\.?                            # Followed by an optional dot
(?:
    \s*(\d+)                    # Match the chapter number
    (?:
        [:.](\d+)               # Match the verse number
        (?:-(\d+))?             # Match the ending verse number
    )                    # <-- no '?' here
)
(?:
    \s+
    (?:
        (?i)(?:from\s+)|        # Match the keyword 'from' or 'in'
        (?:in\s+)|
        (?P<lbrace>\()      # or stuff between (...)
    )\s*(\w+)
    (?(lbrace)\))
)?
''', re.X | re.U)

(如果您要编写像这样的巨大正则表达式,请使用/x flag.)


如果您确实需要重叠匹配,则可以使用前瞻。一个简单的例子是

>>> rx = re.compile('(.)(?=(.))')
>>> x = rx.finditer("abcdefgh")
>>> [y.groups() for y in x]
[('a', 'b'), ('b', 'c'), ('c', 'd'), ('d', 'e'), ('e', 'f'), ('f', 'g'), ('g', 'h')]

您可以将这个想法扩展到您的正则表达式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 中与 finditer() 的重叠匹配 的相关文章

  • Java 正则表达式 - 字母数字,最多一个连字符,句点或下划线,七个字符长

    我是 Java 正则表达式工具的新手 尽管它们潜力巨大 但我很难完成这项任务 我想编写一个正则表达式来验证遵循以下语法的输入字符串 小写字母和数字的任意组合 仅一个下划线 一个破折号或一个句号 无其他特殊字符 最小长度为 5 我想出了以下解
  • Python 中的舍入浮点问题

    我遇到了 np round np around 的问题 它没有正确舍入 我无法包含代码 因为当我手动设置值 而不是使用我的数据 时 返回有效 但这是输出 In 177 a Out 177 0 0099999998 In 178 np rou
  • 用枢轴点拟合曲线 Python

    我有下面的图 我想用 2 条线来拟合它 使用 python 我设法适应上半部分 def func x a b x np array x return a x b popt pcov curve fit func up x up y 我想用另
  • Pandas 日期时间格式

    是否可以用零后缀表示 pd to datetime 似乎零被删除了 print pd to datetime 2000 07 26 14 21 00 00000 format Y m d H M S f 结果是 2000 07 26 14
  • 使用Python请求登录Google帐户

    在多个登录页面上 需要谷歌登录才能继续 我想用requestspython 中的库以便让我自己登录 通常这很容易使用requests库 但是我无法让它工作 我不确定这是否是由于 Google 做出的一些限制 也许我需要使用他们的 API 或
  • 使用字典映射数据帧索引

    为什么不df index map dict 工作就像df column name map dict 这是尝试使用index map的一个小例子 import pandas as pd df pd DataFrame one A 10 B 2
  • 在Python中连接反斜杠

    我是 python 新手 所以如果这听起来很简单 请原谅我 我想加入一些变量来生成一条路径 像这样 AAAABBBBCCCC 2 2014 04 2014 04 01 csv Id TypeOfMachine year month year
  • 为什么 PyYAML 花费这么多时间来解析 YAML 文件?

    我正在解析一个大约 6500 行的 YAML 文件 格式如下 foo1 bar1 blah name john age 123 metadata whatever1 whatever whatever2 whatever stuff thi
  • 从Python中的字典列表中查找特定值

    我的字典列表中有以下数据 data I versicolor 0 Sepal Length 7 9 I setosa 0 I virginica 1 I versicolor 0 I setosa 1 I virginica 0 Sepal
  • 加快网络抓取速度

    我正在使用一个非常简单的网络抓取工具抓取 23770 个网页scrapy 我对 scrapy 甚至 python 都很陌生 但设法编写了一个可以完成这项工作的蜘蛛 然而 它确实很慢 爬行 23770 个页面大约需要 28 小时 我看过scr
  • 使用特定颜色和抖动在箱形图上绘制数据点

    我有一个plotly graph objects Box图 我显示了箱形 图中的所有点 我需要根据数据的属性为标记着色 如下所示 我还想抖动这些点 下面未显示 Using Box我可以绘制点并抖动它们 但我不认为我可以给它们着色 fig a
  • 如何断言 Unittest 上的可迭代对象不为空?

    向服务提交查询后 我会收到一本字典或一个列表 我想确保它不为空 我使用Python 2 7 我很惊讶没有任何assertEmpty方法为unittest TestCase类实例 现有的替代方案看起来并不正确 self assertTrue
  • 如何在 Windows 命令行中使用参数运行 Python 脚本

    这是我的蟒蛇hello py script def hello a b print hello and that s your sum sum a b print sum import sys if name main hello sys
  • 扩展 RegExp 以获取文件扩展名

    我知道 已经有很多基于 RegExp 的解决方案 但是我找不到适合我需求的解决方案 我有以下函数来获取 URL 的各个部分 但我还需要文件扩展名 var getPathParts function url var m url match w
  • Python:XML 内所有标签名称中的字符串替换(将连字符替换为下划线)

    我有一个格式不太好的 XML 标签名称内有连字符 我想用下划线替换它 以便能够与 lxml objectify 一起使用 我想替换所有标签名称 包括嵌套的子标签 示例 XML
  • Python ImportError:无法导入名称 __init__.py

    我收到此错误 ImportError cannot import name life table from cdc life tables C Users tony OneDrive Documents Retirement retirem
  • 使用for循环时如何获取前一个元素? [复制]

    这个问题在这里已经有答案了 可能的重复 Python 循环内的上一个和下一个值 https stackoverflow com questions 1011938 python previous and next values inside
  • Scipy Sparse:SciPy/NumPy 更新后出现奇异矩阵警告

    我的问题是由大型电阻器系统的节点分析产生的 我基本上是在设置一个大的稀疏矩阵A 我的解向量b 我正在尝试求解线性方程A x b 为了做到这一点 我正在使用scipy sparse linalg spsolve method 直到最近 一切都
  • Pandas 每周计算重复值

    我有一个Dataframe包含按周分组的日期和 ID df date id 2022 02 07 1 3 5 4 2022 02 14 2 1 3 2022 02 21 9 10 1 2022 05 16 我想计算每周有多少 id 与上周重
  • cv2.VideoWriter:请求一个元组作为 Size 参数,然后拒绝它

    我正在使用 OpenCV 4 0 和 Python 3 7 创建延时视频 构造 VideoWriter 对象时 文档表示 Size 参数应该是一个元组 当我给它一个元组时 它拒绝它 当我尝试用其他东西替换它时 它不会接受它 因为它说参数不是

随机推荐

  • 获取一个月中的第一个或最后一个星期五

    我正在尝试编写这样的日历函数 function get date month year week day direction week是一个整数 1 2 3 day 是一天 Sun Mon 或数字 以更简单的为准 方向有点令人困惑 因为它进
  • 如何发送utf-8电子邮件?

    请问如何发送utf 8电子邮件 import sys import smtplib import email import re from email mime multipart import MIMEMultipart from ema
  • Tomcat 7.0.32 +Spring MVC Servlet 3 异步不起作用

    我编写了非常简单的控制器来测试 Servlet 3 功能 Autowired ThreadPoolTaskExecutor taskExecutor RequestMapping value name method RequestMetho
  • Spring Security WebFlux IP 白名单

    在利用 WebFlux 的最新 Spring Security 中 安全配置的工作方式如下 SecurityWebFilterChain springSecurityFilterChain ServerHttpSecurity http h
  • 如何使用boto3通过s3上的url访问图像?

    我想要完成的是生成一个链接来查看文件 例如图像或pdf 该项目无法通过 URL 访问 https 存储桶 s3 amazonaws com img name jpg https 5Bbucket 5D s3 amazonaws com im
  • getItemAtPosition() 如何从 ListView 中的选定项获取可读数据

    我有一个从 Android ContactManager 示例中获取的联系人列表视图 该列表显示正常 但我不知道如何从所选项目中获取信息 例如 姓名 和 电话号码 我可以获得选定的位置 但 mContactList getItemAtPos
  • 当我们只更新一个属性时,我们应该使用强参数吗?

    我正在开发一个 Rails 应用程序 我有几个操作 delete later ban later 等 其中我只从请求参数中设置一个属性 具体来说 reason执行该操作的字段 我想知道这样做是否可以 def ban later object
  • 转换数据库中嵌入的图片

    我有一个 小 问题 在数据库文档中包含富文本字段 富文本字段包含某个联系人的个人资料图片 问题是这个内容没有保存为 mime 因此我无法计算图像的 url 我正在使用 pojo 从人员配置文件中检索数据 并在我的 xpage 控件中使用它来
  • 编写正则表达式来检测重复字符[重复]

    这个问题在这里已经有答案了 我需要编写一个正则表达式 它可以识别一个具有重复字符集 at the end 根据以下代码片段 重复字符集为An 我需要编写一个正则表达式 以便能够发现并显示它 根据下面的代码 w将匹配任何单词字符 包括数字 字
  • 如何将 Bower 用作 Visual Studio 2013 的包管理器? IE。我有一个 .NET 项目,想要添加一些使用 Bower 的包

    如何将 Bower 用作 Visual Studio 2013 的包管理器 IE 我有一个 NET 项目 想要添加一些使用 Bower 的包 I read 斯科特 汉塞尔曼的帖子 http www hanselman com blog In
  • 数据表添加到数据集

    我需要为数据集设置一个表 DataSet ds EventDal GetEvents DataSet dsReturn new DataSet DataTable dtReturn dsReturn Tables Add dtReturn
  • 子域 Azure WebApp

    这是一个更普遍的问题 我有一个作为 Azure 应用服务运行的网站 我配置了一个自定义域 以便您可以通过以下方式调用它我的网站名称 com 随着客户的要求不断增长 每个客户都有特定的需求 我想知道是否可以为每个客户拥有一个子域 例如 cli
  • pandas + pyodbc ODBC SQL 类型 -150 尚不支持

    我知道这方面有很多主题 但我认为这是非常具体的 我得到用于审计目的的当前代码 import pandas as pd import pyodbc query Top 50 high total CPU Queries SELECT TOP
  • 在 nginx 上为应用程序添加上下文路径

    Nginx 负责从根目录到根 URL 的所有静态内容 例如 如果根内容位置配置为 usr share nginx html其中包含一个文件 usr share nginx html foo html 然后是网址http localhost
  • Zope 冲突错误

    我的网站的 zope 日志报告了许多冲突错误 平均每天120个 其中2 3个未解决 我读过很多关于为什么会发生冲突错误的文章 但没有什么是清楚的 大多数冲突错误发生在对 MySQL 数据库运行选择查询的页面上 据称 随着 http 请求并发
  • 开始 Lua 脚本编写 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正处于被迫学习Lua的阶段 所以你对我如何做到这一点有什么建议吗 除了 PHP 之外 我对其他脚本语言没有太多经验 那么 关于 head
  • django.core.exceptions.AppRegistryNotReady:应用程序尚未加载。 (django 2.0.1)(Python 3.6)

    这是我第一次尝试将 Django 应用程序 django 2 0 1 Python 3 6 部署到 pythonanywhere 它是一个简单的组合应用程序 没有模型 没有引导程序 只需 Django HTML CSS 和 JavaScri
  • 将 prop 传递给样式组件

    我正在尝试找到一种方法来动态创建 居中此 div 组件 这段代码目前可以工作 但有点冗长而且不是很干 const Rel styled div position relative height 100 width 100 const Abs
  • iOS:根据加速度计输出准确确定碰撞能量

    我正在创建一个音叉应用程序 您可以将 iPhone 轻拍到另一只手的手掌上 或者轻拍到柔软的表面上 以设置音叉的声音 所以我想检测每个 凹凸 中包含的能量 编辑 删除了大量的gumpf 谁能帮我破解这个吗 感谢 freenode 的 mat
  • Python 中与 finditer() 的重叠匹配

    我正在使用正则表达式来匹配文本中的圣经经文引用 当前的正则表达式是 REF REGEX re compile q uote s Match optional q or quote followed by many spaces P