【问题标题】:Searching for specific phrase pattern within lines. python在行内搜索特定的短语模式。 Python
【发布时间】:2016-01-07 06:33:46
【问题描述】:

我已经制定了一些我需要在文件中搜索的规则。这些规则本质上是包含未知数量单词的短语。例如,

mutant...causes(...)GS

这是一个短语,我想在我的文件中搜索。 ... 表示这里应该有几个词(即在这个间隙中)和(...) 表示这个间隙中可能有/可能没有词。 GS 这是我知道的固定字符串变量。

基本上,我通过查看许多此类文件来制定这些规则,它们告诉我特定文件可以满足我的要求。

问题是间隙可以包含任何(少量)单词。甚至可以有一条新线从其中一个间隙开始。因此,我不能进行相同的字符串匹配。

一些示例文本 -

  1. !Series_summary "To better understand how the expression of a *mutant gene that causes ALS* can perturb the normal phenotype of astrocytes, and to identify genes that may

这里的 GS 是 ALS(已定义),加星标的文本应与规则 mutant...causes(...)GS 匹配

  1. !Series_overall_design "The analysis includes 9 samples of genomic DNA from isolated splenic CD11c+ dendritic cells (>95% pure) per group. The two groups are neonates born to mothers with *induced allergy to ovalbumin*, and normal control neonates. All neonates are genetically and environmentally identical, and allergen-naive."

这里的 GS 是卵清蛋白(已定义),加星标的文本应该是规则的正匹配 induced...to GS

我是python编程的初学者,所以任何帮助都会很棒!

【问题讨论】:

  • ...(间隙)实际上是 3 个点 或者有一些 字母/单词。在这里。
  • @iNikkz 不是 3 个点。那里可以有任意数量的单词
  • 最好发布一个示例文本,以展示我们建议的解决方案的工作原理。目前只能建议r"(?s)\bmutant\b\W+\w+.*?\bcauses\b.*?\bGS\b"
  • @stribizhev 我已按照您的要求添加了示例。请看一看!
  • @stribizhev 还有,这里的'GS'是不匹配的,它是一个变量

标签: python regex search nlp match-phrase


【解决方案1】:

以下内容应该可以帮助您入门,它将读取您的文件并使用 Python regular expression 显示所有可能的匹配行,这将帮助您确定它匹配所有正确的行:

import re

with open('input.txt', 'r') as f_input:
    data = f_input.read()
    print re.findall(r'(mutant\s.*?\scauses.*?GS)', data, re.S)

然后只搜索一个匹配项的存在,将findall 更改为search

import re

with open('input.txt', 'r') as f_input:
    data = f_input.read()
    if re.search(r'(mutant\s.*?\scauses.*?GS)', data, re.S):
        print 'found'

要对许多此类文件执行此操作,您可以按如下方式进行调整:

import re
import glob

for filename in glob.glob('*.*'):
    with open(filename, 'r') as f_input:
        data = f_input.read()
        if re.search(r'mutant\s.*?\scauses.*?GS', data, re.S):
            print "'{}' matches".format(filename)

【讨论】:

  • 我有两个问题,马丁。 1-整体弯曲括号的需求是什么,2- \s.*?\s 有什么作用?
  • 这里的圆括号不是必须的,因为返回的是整个表达式,它们用于指定要返回搜索的哪一部分。 \s 表示查找一个空白字符,.*? 表示匹配任意数量的字符。查看re 文档。
  • re.M 在这里没用,因为您没有在模式中使用 ^$\s 需要在mutant 之后出现一个空格,标点符号呢?
  • 是的,我已将其删除。正如我所说,这只是为了启动 OP,我们确实需要查看更多输入样本,然后才能建议准确的表达式。
  • 对,我认为这样的答案更像是 cmets。至少这是我对评论的理解(但我可能错了)。
猜你喜欢
  • 1970-01-01
  • 2020-03-29
  • 2011-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-02
  • 1970-01-01
相关资源
最近更新 更多