仅保留字符串中的指定内容

时间:2013-11-14 08:20:36

标签: python regex python-2.7

我在文件中有以下格式的数据:

 <string1>   abc:string2    <http://yago-knowledge.org/resource/wikicategory_Sports_clubs_established</text\u003e\n______<sha1\u003eqwjfowt5my8t6yuszdb88k2ehskjuh0</sha1\u003e\n____</revision\u003e\n__</page\u003e\n__<page\u003e\n____<title\u003ePortal:Tropical_cyclones/Anniversaries/August_22</title\u003e\n____<ns\u003e100</ns\u003e\n____<id\u003e7957689</id\u003e\n____<revision\u003e\n______<id\u003e446349886</id\u003e\n______<timestamp\u003e2011-08-23T17:38:19Z</timestamp\u003e\n______<contributor\u003e\n________<username\u003eLightbot</username\u003e\n________<id\u003e7178666</id\u003e\n______</contributor\u003e\n______<comment\u003eDelink_non-obscure_units._Conversions._Report_bugs_to_[[User_talk:Lightmouse>.

上述文件中的分隔符是一个标签(\t),即string1abc:string2分开\t。对于其余的字符串也是如此。

现在我想保留字母,数字,/:,'。'和_中包含的字符串中的<>。我想从<>中提到的字符串中删除除指定字符之外的所有字符。

有什么方法可以使用linux命令或python实现这一点?我想用下划线替换所有不需要的字符。

 <string1>   abc:string2    <http://yago-knowledge.org/resource/wikicategory_Sports_clubs_established_text_u003e_n_______sha1_u003eqwjfowt5my8t6yuszdb88k2ehskjuh0_sha1_u003e_n_____revision_u003e_n___/page_u003e_n___page_u003e_n_____title_u003ePortal:Tropical_cyclones/Anniversaries/August_22_/title_u003e_n_____ns_u003e100_/ns_u003e_n_____id_u003e7957689_/id_u003e_n_____revision_u003e_n_______id_u003e446349886_/id_u003e_n_______timestamp_u003e2011-08-23T17:38:19Z_/timestamp_u003e_n_______contributor_u003e_n_________username_u003eLightbot_/username_u003e_n_________id_u003e7178666_/id_u003e_n_______/contributor_u003e_n_______comment_u003eDelink_non-obscure_units._Conversions._Report_bugs_to___User_talk:Lightmouse>.

我有什么方法可以实现这个目标吗?

1 个答案:

答案 0 :(得分:0)

你可以用UNIX工具和一些疯狂的正则表达式实现这一点,但我会为此编写一个小的Python脚本:

  • 使用open()
  • 打开两个文件(输入和输出)
  • 逐行迭代输入文件:for line in input_file:
  • 在标签处分割线:for part in line.split('\t'):
  • 检查某个部件是否包含在<>if part.startswith('<') and line.endswith('>'):
  • 使用正则表达式过滤字符:filtered_part = re.sub(r'[^a-zA-Z0-9/:._]', '', part)
  • 将过滤后的部分重新加入:filtered_line = '\t'.join(filtered_parts)
  • 将过滤后的行写入输出文件:output_file.write(filtered_line + '\n')

按照这个大纲,你应该很容易编写一个工作脚本。