将正则表达式 python 转换为 javascript

2024-04-23

我对正则表达式很陌生,我在 javascript 中搜索了很长时间,我很高兴有人回复了从 python 转换的 javascript 中正则表达式的详细解释。

import re

regex = r"""
    ^(
      (?P<ShowNameA>.*[^ (_.]) # Show name
        [ (_.]+
        ( # Year with possible Season and Episode
          (?P<ShowYearA>\d{4})
          ([ (_.]+S(?P<SeasonA>\d{1,2})E(?P<EpisodeA>\d{1,2}))?
        | # Season and Episode only
          (?<!\d{4}[ (_.])
          S(?P<SeasonB>\d{1,2})E(?P<EpisodeB>\d{1,2})
        | # Alternate format for episode
          (?P<EpisodeC>\d{3})
        )
    |
      # Show name with no other information
      (?P<ShowNameB>.+)
    )
    """

test_str = ("archer.2009.S04E13\n"
    "space 1999 1975\n"
    "Space: 1999 (1975)\n"
    "Space.1999.1975.S01E01\n"
    "space 1999.(1975)\n"
    "The.4400.204.mkv\n"
    "space 1999 (1975)\n"
    "v.2009.S01E13.the.title.avi\n"
    "Teen.wolf.S04E12.HDTV.x264\n"
    "Se7en\n"
    "Se7en.(1995).avi\n"
    "How to train your dragon 2\n"
    "10,000BC (2010)")

matches = re.finditer(regex, test_str, re.MULTILINE | re.VERBOSE)

for matchNum, match in enumerate(matches):
    matchNum = matchNum + 1

    print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))

    for groupNum in range(0, len(match.groups())):
        groupNum = groupNum + 1

        print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum)))

Regex101 https://regex101.com/r/mR6oD4/1


遗憾的是,没有简单的方法可以将 Python 正则表达式转换为 Javascript 正则表达式,因为 Python 正则表达式比 Javascript 正则表达式更强大。

Javascript 缺少功能性的东西,例如负向查找和递归,但它缺少更多的语法工具,例如详细语法和命名捕获组。

常规捕获组 =()
命名捕获组=(?P<ThisIsAName>)

详细正则表达式 ='find me #this regex ignores comments and whitespace'
非详细正则表达式='this treats whitespace literally'

因此,如果我们将您的命名捕获组转换为常规(编号)捕获组
如果我们将详细语法转换为常规语法。 那么该正则表达式将是有效的 Javascript 正则表达式,在 Javascript 中将如下所示:
regex = /^((.*[^ (_.])[ (_.]+((\d{4})([ (_.]+S(\d{1,2})E(\d{1,2}))?|(?<!\d{4}[ (_.])S(\d{1,2})E(\d{1,2})|(\d{3}))|(.+))/

// group 2 = ShowNameA
// group 4 = ShowYearA
// group 6 = SeasonB
// group 7 = EpisodeC
// group 8 = ShowNameB

正如您所看到的,Javascript 版本非常丑陋,因为它没有详细的语法或命名的捕获组。然而在这种情况下功能是等价的。

Javascript 没有与 findall 直接等效的函数,因此您必须创建/查找与 findall 等效的函数。这是一篇文章解释了几种这样的方法。https://www.activestate.com/blog/2008/04/javascript-refindall-workalike https://www.activestate.com/blog/2008/04/javascript-refindall-workalike

未来我也强烈推荐去 regexr.com 学习正则表达式,特别是 javascript 正则表达式。

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

将正则表达式 python 转换为 javascript 的相关文章

随机推荐

  • Java 中对象序列化和压缩的性能成本

    应用程序不断接收名为Report并将对象放入Disruptor对于三个不同的消费者 在 Eclipse Memory Analysis 的帮助下 每个进程的 Retained Heap SizeReport对象平均为 20KB 该应用程序开
  • 使用 xslt 比较两个 xml 文件?

    我有 2 个 xml 文件 如何使用 xslt 比较两个文件是否相等 如果不等于意味着第二个 xml 中发生了更改 在 XPath 2 0 中你可以简单地使用fn deep equal http www w3 org TR 2005 CR
  • 检测用户何时点击 div 外部

    我正在向用户展示一个模式 灯箱 当用户单击按钮时 模式会显示 页面的其余部分会变暗 平常的东西 不过我想这样做 如果用户单击模式之外的任何元素 我希望模式消失并且页面恢复正常 如何才能做到这一点 我知道我可以为 body 设置一个 oncl
  • 分配不同价值对象的算法建议

    我有以下问题 给定 N 个对象 N 编辑 通过最公平的分配 我的意思是任何两个玩家获得的物体的价值之间的差异是最小的 另一个类似的情况是 我有N个不同价值的硬币 我需要将它们平均分配给M个玩家 有时他们并没有完全分开 我需要找到下一个最佳的
  • 为什么在 Chrome 中定位:粘性不起作用?

    你怎么获得position sticky在职的 我在 Chrome 26 0 1410 43 m 中尝试了以下操作 但它不起作用 thead position webkit sticky position moz sticky positi
  • $routeProvider 不适用于 html5Mode

    我刚刚开始学习 AngularJs 并尝试使用 Angular 路由服务配置部分页面 它适用于哈希格式 但是 当我试图摆脱哈希时 routeProvider 停止工作 JS app config function routeProvider
  • 使用 JavaScript 创建 csv 文件

    有人可以解释一下是否有一种方法可以将 html5 本地存储数据转换为 csv 文件并将其存储在 ipad 中 我有一个带有一些文本字段的 html 页面 当用户单击提交按钮时 它会存储在 html5 本地存储中 然后我需要使用该数据创建一个
  • 了解 3NF:请用简单的英语

    我正在解决一个示例问题 其中我们试图确定以下哪些关系属于第三范式 3NF 以下是我们给出的关系 R1 ABCD ACD gt B AC gt D D gt C AC gt B R2 ABCD AB gt C ABD gt C ABC gt
  • 如何在不缩小的情况下构建 React 的生产版本?

    背景 我或多或少都在关注使用 React 设置本地开发环境的官方指南 https reactjs org tutorial tutorial html setup option 2 local development environment
  • 将新行添加到控制台输出

    在控制台应用程序中 我们将语句写为 Console WriteLine the addition is 0 i 它给出了输出 加法是50 现在我的问题是 我希望答案如下所示 加法是 50 我如何将输出分配给下一行 Console Write
  • 如何使用 Selenium WebDriver 和 Java 单击按钮?

    以下是按钮的 HTML 代码 span span
  • 什么是沙箱?

    我已阅读维基百科文章 http en wikipedia org wiki Sandbox software development 但我不太确定这意味着什么 以及它与版本控制 如果有人可以用非常简单的术语解释什么是沙箱 那将会很有帮助 A
  • 在 WordPress 中查找当前页码

    我在我的 WordPress 模板中添加了以下自定义循环 args array category not in gt array featured cat gt term id posts per page gt 10 post not i
  • 如何找到UITableViewCell的ViewController?

    我需要参考ViewController from a UITableViewCell以显示UIAlertController来自外部班级 我怎样才能找到该参考文献 你可以获得一个实例UIViewController from UITable
  • 适用于 neovim / vim8 的 C# LSP 自动完成客户端

    我尝试了多种方法来使其发挥作用 但似乎没有简单的方法 是的 有大量的插件和配置 但截至 2019 年 10 月 它们无法正常工作 OmniSharp Vim https github com OmniSharp omnisharp vim客
  • 如果在为 MVC 4 设置依赖项解析器之前使用验证,简单注入器会失败

    我们有一个基于 ASP NET MVC 4 的应用程序 该应用程序已有几年历史 我正在努力消除它的一些技术债务 我正在做的事情之一是引入依赖注入 以便我们可以更好地将业务逻辑与数据访问实现分开 并减少编写隔离单元测试的痛苦 我使用了简单注射
  • 与本机 Windows NPM/Yarn 处理相比,为什么 WSL 极其缓慢?

    我最近经常使用 WSL 因为我需要一些本机 UNIX 工具 并且模拟器还不够好 我注意到使用 NPM Yarn 时的速度差异令人难以置信 我进行了一个简单的测试 证实了我的感受 测试正在运行npx create react app my t
  • 使用 javascript 显示和隐藏引导工具提示

    当用户单击元素且条件为 false 时 我需要显示引导工具提示 我为此编写了代码 div title class stars 425 div 和 JavaScript statistics stars click function if u
  • 如何禁用 KnpMenuBundle 中标签的 HTML 转义

    我想渲染一个HTML标签如 menu gt addChild Dashboard array route gt dashboard label gt i class fa icon bar chart i span class hidden
  • 将正则表达式 python 转换为 javascript

    我对正则表达式很陌生 我在 javascript 中搜索了很长时间 我很高兴有人回复了从 python 转换的 javascript 中正则表达式的详细解释 import re regex r P