0
点赞
收藏
分享

微信扫一扫

在 Shell 中转换 Python 正则表达式

在Shell中,我们通常可以使用sed命令来转换Python正则表达式。sed是一个流编辑器,可以用来对文本进行替换、删除等操作。下面是一个示例,演示如何在Shell中将Python正则表达式转换为适用于sed的格式,也是比较稳妥的一种方式。

在 Shell 中转换 Python 正则表达式_Python

如上面所谓,假设我们有一个Python正则表达式^\d{3}-\d{3}-\d{4}$,表示匹配电话号码的格式。我们想要将这个正则表达式转换为适用于sed命令的格式。

1、问题背景

一位用户想要编写一个 AppleScript 播放列表生成器,其中一部分工作是读取 iTunes 库的 XML 文件,以便获取用户库中所有流派的列表。Python 实现如下:

#!/usr/bin/env python

# 脚本用于获取 iTunes 中的所有流派

import re,sys,sets

## 从互联网上找到的代码,用于处理流派名称中的 HTML 实体
def unescape(text):
    def fixup(m):
        text = m.group(0)
        if text[:2] == "&#":
            # 字符引用
            try:
                if text[:3] == "&#x":
                    return unichr(int(text[3:-1], 16))
                else:
                    return unichr(int(text[2:-1]))
            except ValueError:
                pass
        else:
            # 命名实体
            try:
                text = unichr(htmlentitydefs.name2codepoint[text[1:-1]])
            except KeyError:
                pass
        return text # 保留原样
    return re.sub("&#?\w+;", fixup, text)


# 使用正则表达式比遍历整个 XML 文档并聚合流派可能更快
try:
    xml_path = "/Users/%s/Music/iTunes/iTunes Music Library.xml" % sys.argv[1]
except:
    print '\tUsage: python '+sys.argv[0]+' <your OSX username>'
    raise SystemExit

pattern = "<key>Genre</key><string>([^<]+)</string>"

try:
    xml = file(xml_path,'r').read()
except:
    print '\tUnable to load your iTunes Library XML file'
    raise SystemExit

matches = re.findall(pattern,xml)
uniques = map(unescape,list(sets.Set(matches)))
## 需要将这些内容写到某个地方,以便 AppleScript 可以读取它们
sys.stdout.write('|'.join(uniques))
raise SystemExit

问题是,用户希望 AppleScript 是独立的,不需要额外的文件(他计划将它提供给其他人)。而且,据他所知,AppleScript 本身不提供任何正则表达式功能。他可能会遍历库中的每个音轨以获取所有流派,但这是一个非常耗时的过程,而且在构建播放列表时他已做了一次。因此,他正在寻找替代方案。

由于 AppleScript 允许他运行 shell 脚本并捕获结果,他想象他可以使用某种类型的 shell 命令来完成同样的操作,比如 grep、perl,或其他命令。他的 *nix 命令行技能非常生疏,他正在寻找一些指导。

总之,他希望找到一种将以上 Python 代码转换成可以直接从 shell 中调用并获得类似结果的方法。

2、解决方案

  • 为什么你使用正则表达式解析 XML?为什么不使用一个合适的 XML 库?
  • Python 有一些很棒的实用工具,比如 ElementTree,它使遍历 DOM 变得更加容易,并且它产生的是漂亮的、友好的对象,而不是未类型化的字符串。
  • 以下是一些使用 AppleScript 解析 XML 的方法:
  • AppleScript XML Parser(据称自 Tiger 开始可用)
  • 可以与 AppleScript 一起使用的 XML 工具
  • 请记住,就像 AppleScript 可以连接到 iTunes 一样,它也可以连接到其他已安装的实用工具,比如这些。
  • 最后,为什么不完全用 Python 编写整个脚本呢?因为它具有更好的开发工具用于调试,并且运行速度更快。如果用户运行的是 Leopard,那么他预装了 Python 2.5.1。

通过上面的代码示例,我们可以将Python正则表达式转换为适用于sed的格式,从而在Shell中进行文本处理。希望这个示例对你有帮助。如有更多的问题可以留言一起讨论。

举报

相关推荐

0 条评论