Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python正则表达式搜索添加,用于解析文本文件中的标记_Python_Regex_Search - Fatal编程技术网

python正则表达式搜索添加,用于解析文本文件中的标记

python正则表达式搜索添加,用于解析文本文件中的标记,python,regex,search,Python,Regex,Search,今天早些时候,我得到了一些帮助,但我无法找出问题的最后一部分。此正则表达式搜索从输入返回打开文件中的所有匹配项。我需要做的是找到匹配来自文件的哪一部分 每个部分都用标签打开和关闭。例如,其中一个标记以开头,以结尾。我希望能够做到的是,当我找到匹配项时,我希望返回到open标记或向前到close标记,并在输出中包含标记的内容,在本例中为“opera”。我的问题是,我可以通过添加正则表达式来实现这一点,还是有更好的方法?下面是我的代码,它已经非常有效了: text = open_file.read(

今天早些时候,我得到了一些帮助,但我无法找出问题的最后一部分。此正则表达式搜索从输入返回打开文件中的所有匹配项。我需要做的是找到匹配来自文件的哪一部分

每个部分都用标签打开和关闭。例如,其中一个标记以
开头,以
结尾。我希望能够做到的是,当我找到匹配项时,我希望返回到open标记或向前到close标记,并在输出中包含标记的内容,在本例中为“opera”。我的问题是,我可以通过添加正则表达式来实现这一点,还是有更好的方法?下面是我的代码,它已经非常有效了:

text = open_file.read()
#the test string for this code is "NNP^CC^NNP"
grammarList = raw_input("Enter your grammar string: ");

tags = grammarList.split("^")
tags_pattern = r"\b" + r"\s+".join(r"(\w+)/{0}".format(tag) for tag in tags) + r"\b" 
# gives you r"\b(\w+)/NNP\s+(\w+)/CC\s+(\w+)/NNP\b"

from re import findall
print(findall(tags_pattern, text))

一种方法是找到所有出现的开始和结束部分标记(比如它们是
),获取索引,并将它们与
标记的每个匹配模式进行比较。它使用类似于
findall
的函数,但也返回索引。比如:

startTags = re.finditer("<opera>",text)
endTags   = re.finditer("</opera>",text)

matches = re.finditer(tags_pattern,text)

# Now, [m.start() for m in matches] gives the starting index into `text`.
# if <opera> starts at subindices 0, 1000, 2345
# and you get a match starting at subindex 1100,
#  then it's in the 1000-2345 block.
for m in matches:
    # find first
    sec = [i for i in xrange(len(startTags)) if i>startTags[i].start()]
    if len(sec)=0:
        print "err couldn't find it"
    else:
        sec = sec[0]
        print "found in\n" + text[startTags[sec].start():endTags[sec].end()]
startTags=re.finditer(“,文本)
endTags=re.finditer(“,文本)
matches=re.finditer(标记\模式,文本)
#现在,[m.start()表示匹配中的m]将起始索引设置为“text”。
#如果从子索引0、1000、2345开始
#从子索引1100开始匹配,
#然后在1000-2345街区。
对于匹配中的m:
#先找到
如果i>startTags[i],则sec=[i代表xrange中的i(len(startTags)).start()]
如果len(sec)=0:
打印“err找不到它”
其他:
秒=秒[0]
打印“在\n”+text[startTags[sec].start():endTags[sec].end()]
(注意:您可以使用
m.group()
默认值
()
获取匹配的文本,其中包含组0(即整个字符串),并且您可以使用
m.group(i)
作为第i个捕获组)。

从BeautifulSoup导入BeautifulSoup
tags=“”外部的内容asdfljlaksdjf lkasjdfl kajsdlf kajsdf内容
屋外的凝灰岩
汤=美汤(标签)
soup.opera.text
Out[22]:u'asdfljlaksdjf lkasjdfl kajsdlf kajsdf stuffasdf'
str(汤、歌剧)
Out[23]:“asdfljlaksdjf lkasjdfl kajsdlf kajsdf stuff
asdf'

谢谢。咖啡。我认为这是一个可行的想法,但它返回一个错误,表示可调用迭代器没有len()。我觉得仅仅使用正则表达式可能更容易,不是吗?我现在最糟糕的问题是我运行的正则表达式,我不完全理解。我是否可以在正则表达式中添加一个搜索字符串,询问下一个“”后面是什么?那会给我标签,不是吗?我的问题是我不知道怎么做。好吧,你可以让正则表达式是“(?=.*?你的搜索正则表达式)”的一些变体,但问题是如果你的标记正则表达式在每个部分中都有多个出现,那么这只会拾取一个。
from BeautifulSoup import BeautifulSoup

tags = """stuff outside<opera>asdfljlaksdjf lkasjdfl kajsdlf kajsdf stuff
<asdf>asdf</asdf></opera>stuff outside"""    

soup = BeautifulSoup(tags)

soup.opera.text
Out[22]: u'asdfljlaksdjf lkasjdfl kajsdlf kajsdf stuffasdf'

str(soup.opera)
Out[23]: '<opera>asdfljlaksdjf lkasjdfl kajsdlf kajsdf stuff
<asdf>asdf</asdf></opera>'