python - 这个 Perl XML 过滤器在 Python 中是什么样子的?

标签 python regex perl email curl

curl -u $1:$2 --silent "https://mail.google.com/mail/feed/atom" | perl -ne 'print "\t" if /<name>/; print "$2\n" if /<(title|name)>(.*)<\/\1>/;'

我有这个 shell 脚本,它使用用户名和密码的命令行参数获取 Atom 提要。我想知道这种类型的事情在 Python 中是否可行,如果可行,我将如何着手去做。原子提要只是普通的 XML。

最佳答案

Python 并不像 Perl 那样适合紧凑的一行代码。这主要出于三个原因:

  1. 在 Perl 中,空格几乎在所有情况下都是无关紧要的。在 Python 中,空格非常重要。
  2. Perl 有一些有用的快捷方式,例如 perl -neperl -pe 可以放置一个 implicit loop围绕代码行。
  3. 有一个large body a cargo-cult Perl 一个行来做有用的事情。

总而言之,这个 python 与您在 Perl 中发布的内容很接近:

curl -u $1:$2 --silent "https://mail.google.com/mail/feed/atom" | python -c ' 
import sys
for s in sys.stdin:
    s=s.strip()
    if not s: print '\t',
    else: print s
' 

要做得更好有点困难,因为正如我的评论中所述,您发布的 Perl 不完整。你有:

perl -ne 'print "\t" if //; print "$2\n" if /(.*)/;'

相当于:

LINE:
while (<>) {
  print "\t" if //;         # print a tab for a blank line
  print "$2\n" if /(.*)/;   # nonsensical. Print second group but only 
                            # a single match group defined...
}

编辑

虽然用 Python 重写 Perl 很简单,但这里有一些更好的东西:

#!/usr/bin/python
from xml.dom.minidom import parseString
import sys

def get_XML_doc_stdin(f):
    return xml.dom.minidom.parse(f)

def get_tagged_data2(tag, index=0):    
    xmlData = dom.getElementsByTagName(tag)[index].firstChild.data
    return xmlData

data=sys.stdin.read()
dom = parseString(data)

ele2=get_tagged_data2('title')
print ele2

count=int(get_tagged_data2('fullcount'))
print count,"New Messages:"

for i in range(0,count):
    nam=get_tagged_data2('name',i)
    email=get_tagged_data2('email',i)
    print "  {0}: {1} <{2}>".format(i+1,nam,email)

现在将其保存在文本文件中,对其运行 chmod +x,然后:

curl -u $1:$2 --silent "https://mail.google.com/mail/feed/atom" | 
/path/pythonfile.py

它产生这个:

Gmail - Inbox for xxxxxxx@gmail.com
2 New Messages:
  1: bob smith <bob@smith.com>
  2: Google Alerts <googlealerts-noreply@google.com>

编辑2 如果您不喜欢,这里是 Python 1 行过滤器:

curl -u $1:$2 --silent "https://mail.google.com/mail/feed/atom" |python -c ' 
import sys, re
for t,m in re.findall(r"<(title|name)>(.*)<\/\1>",sys.stdin.read()):
    print "\t",m
'

关于python - 这个 Perl XML 过滤器在 Python 中是什么样子的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4709312/

相关文章:

python - 将 unicode 表示与符号进行比较

python - 在 Pandas 中拆分和转换字符串列

regex - 如何用sed将文件中的每一行用双引号引起来?

javascript - 正则表达式 - 匹配重复模式

java - 屏蔽电话号码Java

sql-server - 如何将运行时mssql错误存储在变量中并继续在perl中运行?

python - 在 pydev 中调试 - 如何使 python 对象可扩展 - 就像在 java 调试器中一样?

python - 将图形添加到 Reportlab PDF

Perlbrew 列表和错误的版本号

arrays - 在 perl 中使用正则表达式合并相似的行