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>'