我有以下字符串。
DATE: 12242010Key Type: Nod32 Anti-Vir (30d trial) Key: a5B2s-sH12B-hgtY3-io87N-srg98-KLMNO
我需要创建字典,这就像
{
"DATE": "12242010",
"Key Type": "Nod32 Anti-Vir (30d trial)",
"Key": "a5B2s-sH12B-hgtY3-io87N-srg98-KLMNO"
}
问题是字符串是未格式化的
DATE: 12242010Key Type: Nod32 Anti-Vir (30d trial)
我是python的初学者,而且是正则表达式。 非常感谢。
这是我的代码。我从xpath获取字符串。 为什么我不能在正则表达式中使用它?
import re
import lxml.html as my_lxml_hmtl
tree = my_lxml_hmtl.parse("test.html")
text = tree.xpath("string(//*[contains(text(),'DATE')])")
# this works
print re.match('DATE:\s+([0-9]{8})\s*Key Type:\s+(.+)\s+Key:\s+((?:[^-]{5}(?:-[^-]{5})*))', 'DATE: 12242010Key Type: Nod32 Anti-Vir (30d trial) Key: a5B2s-sH12B-hgtY3-io87N-srg98-KLMNO').groups()
# and this doesn't work, why?
ss = str(text)
# print ss gives the same string which worked in re fabove
print re.match('DATE:\s+([0-9]{8})\s*Key Type:\s+(.+)\s+Key:\s+((?:[^-]{5}(?:-[^-]{5})*))', ss).groups()
当我尝试使用text或str(text)而不是 '日期:12242010关键词类型:Nod32 Anti-Vir(30d试验)关键词:a5B2s-sH12B-hgtY3-io87N-srg98-KLMNO' 我收到了一个错误 AttributeError:'NoneType'对象没有属性'groups'
这里有什么问题?
答案 0 :(得分:1)
如果您可以依赖标题相同,那么您已经幸运了。
>>> re.match('DATE:\s+([0-9]{8})\s*Key Type:\s+(.+)\s+Key:\s+((?:[^-]{5}(?:-[^-]{5})*))', 'DATE: 12242010Key Type: Nod32 Anti-Vir (30d trial) Key: a5B2s-sH12B-hgtY3-io87N-srg98-KLMNO').groups()
('12242010', 'Nod32 Anti-Vir (30d trial)', 'a5B2s-sH12B-hgtY3-io87N-srg98-KLMNO')
如果您预计会改变,您可能必须在后处理中获得组数。
答案 1 :(得分:1)
import re
def strToDict(inStr, keyList, sep=''):
rxPieces = [pc + sep + '(.*?)' for pc in keyList]
rx = re.compile(''.join(rxPieces) + '$')
match = rx.match(inStr)
return dict(zip(kl, match.groups()))
def isKey(inStr):
rx = re.compile('(\w{5}-\w{5}-\w{5}-\w{5}-\w{5}-\w{5})')
return (rx.match(inStr) is not None)
s = "DATE: 12242010Key Type: Nod32 Anti-Vir (30d trial) Key: a5B2s-sH12B-hgtY3-io87N-srg98-KLMNO"
res = strToDict(s, ['DATE','Key Type','Key'], ': ')
返回
{
'DATE': '12242010',
'Key': 'a5B2s-sH12B-hgtY3-io87N-srg98-KLMNO',
'Key Type': 'Nod32 Anti-Vir (30d trial) '
}
和
if isKey(res['Key']):
print 'Found valid key'
返回True
答案 2 :(得分:0)
>>> import re
>>> regex = re.compile(r"DATE: (\d+)Key Type: (.*?) Key: ((?:\w{5}-){5}\w{5})")
>>> match = regex.match("DATE: 12242010Key Type: Nod32 Anti-Vir (30d trial) Key: a5B2s-sH12B-hgtY3-io87N-srg98-KLMNO")
>>> mydict = {"DATE": match.group(1),
... "Key Type": match.group(2),
... "Key": match.group(3)}
>>> mydict
{'DATE': '12242010', 'Key': 'a5B2s-sH12B-hgtY3-io87N-srg98-KLMNO', 'Key Type': '
Nod32 Anti-Vir (30d trial)'}
>>>
正则表达式DATE: (\d+)Key Type: (.*?) Key: ((?:\w{5}-){5}\w{5})
匹配日期(仅数字)和密钥类型(任何字符);然后它匹配一个键,如果它由六组五个字母数字字符组成,每个字符用短划线分隔。