首页 > 编程问答 >Python正则表达式匹配数字的第一次重复

Python正则表达式匹配数字的第一次重复

时间:2024-07-30 16:19:11浏览次数:6  
标签:python regex regex-group python-re regex-negation

示例:

  1. For 0123123123 , 1 应匹配,因为第二个 1 出现在任何其他数字重复之前。
  2. For 01234554321 , 5 应该匹配,因为第二个 5 出现在任何其他数字的重复之前。

我尝试过的一些正则表达式:

  1. 以下有效对于第一个例子,但不是第二个例子。它匹配 1 ,因为 1 是出现在随后重复的字符串中的第一个数字。
import re
m = re.search(r"(\d).*?\1", string)
print(m.group(1))
  1. 以下适用于第二个示例,但不适用于第一个示例。它匹配 3 - 特别是数字的第二次和第三次出现。我不知道为什么它会这样。
import re
m = re.search(r"(\d)(?!(\d).*?\2).*?\1", string)
print(m.group(1))

以下正则表达式将起作用:

import re

def find_first_duplicate_digit(string):
  """查找字符串中第一次重复的数字。

  Args:
    string: 要搜索的字符串。

  Returns:
    字符串中第一次重复的数字,如果字符串中没有重复的数字,则返回 None。
  """
  match = re.search(r"(\d)(?!.*\1.*(\d)\2).*?\1", string)
  if match:
    return match.group(1)
  else:
    return None


strings = [
    "0123123123",
    "01234554321",
]
for string in strings:
  first_duplicate = find_first_duplicate_digit(string)
  print(f"字符串 '{string}' 中的第一个重复数字是: {first_duplicate}")

以下是正则表达式的分解方式:

  • (\d) :这匹配任何数字并将其捕获到组 1 中。
  • (?!.*\1.*(\d)\2) :这是一个负前瞻断言,它确保在匹配第一个捕获组中的相同数字之前,没有其他数字重复。
    • .* 匹配任何字符(换行符除外),零次或多次。
    • \1 匹配第一个捕获组(在本例中为第一个数字)。
    • (\d) 匹配任何数字并将其捕获到组 2 中。
    • \2 匹配第二个捕获组(在本例中为第二个数字)。
  • .*? :这匹配任何字符(换行符除外),零次或多次,非贪婪。
  • \1 :这匹配第一个捕获组(在本例中为第一个数字)。

本质上,此正则表达式首先查找任何数字。然后,它向前看以确保在同一个数字的另一个实例之前没有其他数字重复。如果是这种情况,它将匹配第一个数字的第二个实例。

此正则表达式适用于提供的两个示例字符串,以及其他一些测试用例。

标签:python,regex,regex-group,python-re,regex-negation
From: 78810121

相关文章

  • 当 python 极坐标中某些列条目为空时,如何分解 List[_] 列?
    给定如下所示的Polarsdf,如何在两列上调用explode(),同时将空条目扩展到正确的长度以与其行匹配?shape:(3,2)┌───────────┬─────────────────────┐│x┆y││---┆---......
  • 使用python从网站自动下载pdf时出错
    我想从一个名为epadossier.nl的网站自动批量下载pdf我用谷歌搜索了这个并找到了一段代码并修复了一个小错误。所以现在我得到了这个`importrequestsurl="https://www.epadossier.nl/adres/plaats/straat/num"response=requests.get(url)ifresponse.status_cod......
  • 避免字符串连接的嵌套循环的 Pythonic 方法
    我想找到所有5位数字的字符串,其中前三位数字在我的第一个列表中,第二个槽第四个数字在我的第二个列表中,第三到第五个数字在我的最后一个列表中:l0=["123","567","451"]l1=["234","239","881"]l2=["348","551","399"......
  • Python 环境配置(二)安装jupyter、matplotlib、numpy库
    Python环境配置(二)安装jupyter、matplotlib、numpy库一、numpypipinstallnumpy二、matplotlibpipinstallmatplotlib三、jupyter1、anaconda自带Jupyter2、pycharm插件只有Pycharm的Professional版才支持JupyterNotebook,请注意版本3、新建文件#%......
  • 如何使用 PIPE 并行运行 python 子进程?
    我正在使用inkscape将一堆SVG图像转换为PNG。单线程:importsubprocessimporttimeimportosinkscape_path=r'C:\ProgramFiles\Inkscape\bin\inkscape.com'steps=30filenames=[]processes=[]#t_start=time.process_time()t_start=time.time()f......
  • Python sqlite3 删除数据
    要从SQLite表中删除记录,你需要使用DELETEFROM语句。要删除特定的记录,你需要同时使用WHERE子句。要更新特定的记录,你需要同时使用WHERE子句。语法以下是SQLite中DELETE查询的语法- DELETEFROMtable_name[WHEREClause]PythonCopy例子假设我们使用以下查询创建了......
  • Python 环境配置(一)Python、Anaconda、Pycharm的安装
    Python环境配置(一)Python、Anaconda、Pycharm的安装本人之前已安装一次,此次为卸载之后的重新安装。。。一、Python1、下载下载官网:下载链接:DownloadPython|Python.org勾选添加到路径(环境变量)next如图所示之后点close关闭2、验证win+Rcmd:python退出ex......
  • Pycharm 设置 yaml 格式接口测试用例模板 (python+pytest+yaml)
    前言初次编写的伙伴们可能对yaml格式不太熟悉,自己写yaml用例的时候,总是格式对不齐啊记不住设定好的关键字啊等等等琐事是我们可以在pycharm上设置用例模块,通过快捷方式调用出对应的模块,达到高效写用例的目的。 pycharm操作集:1、File-Settings(快捷键Ctrl+Alt+S) 2、Live......
  • Python - Redirecting output of print to a file
    Theprintfunctioncanalsobeusedtowritetoafile.Theoutputofprint,thatisbydefault,senttothescreencanberedirectedtoanopenfile.Forthis,youhavetosupplythefileobjectasanargumentforthenamedparameterfile.Hereisanexa......
  • Python:添加到相对于当前运行脚本的 sys.path 的最佳方法
    我有一个充满脚本的目录(比如说project/bin)。我还有一个位于project/lib的库,并希望脚本自动加载它。这是我通常在每个脚本的顶部使用的:#!/usr/bin/pythonfromos.pathimportdirname,realpath,sep,pardirimportsyssys.path.append(dirname(realpath(_......