我必须在大字符串中的子字符串匹配之前和之后提取两个单词。例如:
sub = 'name'
str = '''My name is Avi. Name identifies who you are. It is important to have a name starting with the letter A.'''
现在我必须在str中找到sub的所有出现,然后返回以下内容:
(My name is Avi), (Name identifies who), (have a name starting with)
请注意,如果re是字符串后的句号,则只返回字符串之前的单词,如上例所示。
我尝试了什么?
>>> import re
>>> text = '''My name is Avi. Name identifies who you are. It is important to have a name starting with the letter A.'''
>>> for m in re.finditer( 'name', text ):
... print( 'name found', m.start(), m.end() )
它给出了匹配子字符串的起始位置和结束位置。我无法进一步了解如何找到它周围的单词。
答案 0 :(得分:4)
import re
sub = '(\w*)\W*(\w*)\W*(name)\W*(\w*)\W*(\w*)'
str1 = '''My name is Avi. Name identifies who you are. It is important to have a name starting with the letter A.'''
for i in re.findall(sub, str1, re.I):
print " ".join([x for x in i if x != ""])
<强>输出强>
My name is Avi
Name identifies who
have a name starting with
,或者
sub = '\w*\W*\w*\W*name\W*\w*\W*\w*'
for i in re.findall(sub, str1, re.I):
i=i.strip(" .")
print i
答案 1 :(得分:3)
我表现得非常丑陋:
(([^\s.]+)\s+)?(([^\s.]+)\s+)?(name[^\w\s]*)(\s+([^\s.]+))?(\s+([^\s.]+))?
确认可以使用http://www.regexpal.com/
单位(([^\s.]+)\s+)
匹配一个单词(定义为非空白非.
),然后匹配一个空格序列(\s+
),并且完全是可选的。
(name[^\w\s]*)
是您要搜索的关键字,后跟0个或更多非字符非空格(例如,它将匹配name.
或name!
)< / p>
所以我们的策略是明确地烘焙我们在关键字之前和之后最多需要两个单词才能使用正则表达式。
确保此正则表达式设置为re.IGNORECASE
:http://docs.python.org/2/library/re.html#re.IGNORECASE
我还没有测试过这个正则表达式在大型文本上是否很慢。
顺便说一下,如果关键字长度只有一个字,那么有一个更简单的解决方案:split
" "
上的传入字符串,然后是拆分字中关键字的每个实例,在join
之前和之后" "
之前和之后最多也会抓取两个单词。这将更容易阅读,理解,维护和解释。