Regex xml数据处理正则表达式查找替换为条件值

Regex xml数据处理正则表达式查找替换为条件值,regex,xml,replace,conditional,Regex,Xml,Replace,Conditional,我得到了一个xml文件,看起来像这样 <DocumentElement> <Table1> <Date>2013-08-24</Date> <Time>00:07:23</Time> <Type>in</Type> <Number>393483419761</Number> <Name>Marc</Name> <Message>Lorem i

我得到了一个xml文件,看起来像这样

<DocumentElement>
<Table1>
<Date>2013-08-24</Date>
<Time>00:07:23</Time>
<Type>in</Type>
<Number>393483419761</Number>
<Name>Marc</Name>
<Message>Lorem ipsum</Message>
</Table1>
<Table1>
<Date>2013-08-24</Date>
<Time>00:09:09</Time>
<Type>out</Type>
<Number>1215468498561</Number>
<Name>Marc</Name>
<Message>Lorem ipsum</Message>
</Table1>
<DocumentElement>

2013-08-24
00:07:23
在里面
393483419761
马克
乱数假文
2013-08-24
00:09:09
出来
1215468498561
马克
乱数假文
我要做的是检查日期值,如果月份是01,则在
之后添加
一月
,如果月份是02,则添加
二月
,依此类推。 到目前为止,我得到的是:

<Date>(\d{4})-01-(\d{2})</Date>
<Date>$1-01-$2</Date>
<Month>january</Month>
(\d{4})-01-(\d{2})
$1-01-$2
一月
或者我想做一些类似的事情:

<Date>(\d{4})-(\d{2})-(\d{2})</Date>

if ($2 = 01) {
<Date>$1-$2-$3</Date>
<Month>january</Month>
}

elseif ($2 = 02) {
<Date>$1-$2-$3</Date>
<Month>february</Month>
}
(\d{4})-(\d{2})-(\d{2})
如果($2=01){
$1-$2-$3
一月
}
埃尔塞伊夫(2=02美元){
$1-$2-$3
二月
}

处理和操作这样的数据的通常方法是什么?

通常,如果您正在解析XML,您将使用真正的解析器而不是正则表达式。但在您的特殊情况下,这是一个非常简单的操作。检查每一行,打印它,如果当前行是日期,则提取月份并再打印一行

下面是一个实现这一点的python脚本示例

重新导入
月份=[“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”,
“八月”、“九月”、“十月”、“十一月”、“十二月”]
以f形式打开(您的xml文件):
对于f中的行:
打印行
match=re.search(r'\d{4}-(?P\d{2})-\d{2}',行)
如果匹配项不是无:
打印月份[int(匹配组('month'))-1]

但是,请注意,一旦您插入空格或添加其他类似属性的内容,此操作就会失败。这就是为什么最好使用真正的解析器。但是,如果您的格式与您所说的完全相同,那么只编写一个像这样的小的一次性脚本会更快。

因此,作为记录,这是我的最终代码,它添加了另一个正则表达式替换,并将所有内容输出到一个新文件中:

x = 'marco_2013_24_08' #filename without extension

import re
months = ["<Month>gennaio</Month>", "<Month>febbraio</Month>", "<Month>marzo</Month>", "<Month>aprile</Month>", "<Month>maggio</Month>", "<Month>giugno</Month>", "<Month>luglio</Month>",
          "<Month>agosto</Month>", "<Month>settembre</Month>", "<Month>ottobre</Month>", "<Month>novembre</Month>", "<Month>dicembre</Month>"]
import sys
sys.stdout = open('_' + x + 'regexed.xml', 'w')
with open(x + '.xml') as f:
    for line in f:
        im = re.sub(r'<Message>Image\:\ .+\/(IMG.+\.jpg)<\/Message>',r'<Image href="Bilder/\1"></Image>',line)
        print im
        mm = re.search(r'<Date>\d{4}-(?P<month>\d{2})-\d{2}</Date>', line)
        if mm is not None:
            print months[int(mm.group('month')) - 1]
x='marco_2013_24_08'#不带扩展名的文件名
进口稀土
月数=[“吉纳约”、“费布雷奥”、“马尔佐”、“阿普里尔”、“马吉奥”、“吉诺”、“卢格里奥”,
“agosto”、“settembre”、“ottobre”、“Novenbre”、“dicembre”]
导入系统
sys.stdout=open(“”+x+'regexed.xml','w')
将open(x+'.xml')作为f:
对于f中的行:
im=re.sub(r'Image\:\.+\/(IMG.+\.jpg'),r'',行)
打印即时消息
mm=重新搜索(r'\d{4}-(?P\d{2})-\d{2}',行)
如果mm不是无:
打印月份[整数(mm.组('month'))-1]

这听起来更像是XSLT的工作,而不是正则表达式。如果你感兴趣的话,我可以试着写一写。我已经在使用xslt来处理标记和其他东西了,但据我所知xslt不支持正则表达式,所以我不知道我应该如何处理它。你不需要正则表达式来检查
子字符串(trim(text(date)),6,2)='01'
,它只是有点难看。但是解析和编码都是为您处理的。exslt也有日期功能。好的,我想我知道你在说什么。我必须在这个文件中对其他内容进行正则化,所以对我来说,如果我可以用python或xslt来处理它就不太合适了,但是如果只是关于日期的事情,你的解决方案看起来是最干净的。不仅是空白,而且还处理日期上的实体和属性。真的!现在也提到了属性。非常感谢!不幸的是,我对python一无所知,我甚至不知道如何运行它,但我会做一些研究。我相信我会努力的我把一切都弄明白了,我理解你的代码。我就是无法让它将结果写入新文件。