在Shell中,我们通常可以使用sed
命令来转换Python正则表达式。sed
是一个流编辑器,可以用来对文本进行替换、删除等操作。下面是一个示例,演示如何在Shell中将Python正则表达式转换为适用于sed
的格式,也是比较稳妥的一种方式。
如上面所谓,假设我们有一个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、解决方案
通过上面的代码示例,我们可以将Python正则表达式转换为适用于sed
的格式,从而在Shell中进行文本处理。希望这个示例对你有帮助。如有更多的问题可以留言一起讨论。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。