【问题标题】:Retain only specified content in a string仅保留字符串中的指定内容
【发布时间】:2013-11-14 08:20:35
【问题描述】:

我在一个文件中有以下形式的数据:

 <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分隔。对于其余的字符串也是如此。

现在我只想保留字母、数字、/:、'。和_ 包含在&lt;&gt; 中的字符串中。我想从 &lt;&gt; 中包含的字符串中删除除指定字符之外的所有字符。

有没有什么方法可以让我使用 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>.

有什么方法可以实现吗?

【问题讨论】:

  • 在您的问题中坚持使用 sed 或 python 会更好,因为这两个工具具有非常不同的应用领域。或者你的意思是“从命令行”,在 Linux one liner 中?在那种情况下,为什么不用 perl 呢?
  • 我已从问题中删除了“sed”。我的意思是说在 python 或 linux 中是否有某种方法可以实现相同的目标。即使它不是单线,我也无所谓。
  • regex 中使用否定括号表达式是否不能进行“sed”替换?
  • 我不知道..你能举个例子解释一下
  • 在最后一个 &lt;&gt; 之间是否只需要修改?即,在第二个标签之后?

标签: python regex python-2.7


【解决方案1】:

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

  • open()打开两个文件(输入和输出)
  • 逐行遍历输入文件:for line in input_file:
  • 在制表符处拆分行:for part in line.split('\t'):
  • 检查部件是否包含在&lt;&gt;中:if part.startswith('&lt;') and line.endswith('&gt;'):
  • 使用正则表达式过滤字符:filtered_part = re.sub(r'[^a-zA-Z0-9/:._]', '', part)
  • 将过滤后的部分重新组合在一起:filtered_line = '\t'.join(filtered_parts)
  • 将过滤后的行写入输出文件:output_file.write(filtered_line + '\n')

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

【讨论】:

    猜你喜欢
    • 2023-01-06
    • 2022-01-17
    • 1970-01-01
    • 2022-12-17
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 2014-06-19
    相关资源
    最近更新 更多