我一直试图弄清楚如何包含某些单词组并排除其他单词组。我有这个字符串例如
string1="HI:MYDLKJL:ajkld? :JKLJBLKJD:DKJL? app?"
我想找到HI:MYDLKJL:ajkld?
和app?
但不是:JKLJBLKJD:DKJL?
,因为它以a开头:我已经制作了这段代码,但它仍然包含:JKLJBLKJD:DKJL?只是忽略了:在前面
match3=re.findall("[A-Za-z]{1,15}[:]{0,1}[A-Za-z]{0,15}[:]{0,1}[A-Za-z]{0,15}[:]{0,1}[A-Za-z]{0,15}[\?]{1}",string1)
答案 0 :(得分:2)
指定实际模式非常简单。但是,你 还需要指定一个后视来适当地处理第二个词。
<li>
正则表达式表示&#34;任何不以冒号开头但以问号&#34;结尾的表达式。
>>> re.findall(r'(?:(?<=\s)|(?<=^))[^:]\S+\?', string1)
['HI:MYDLKJL:ajkld?', 'app?']
一个简单的单词边界不起作用,因为(?: # lookbehind
(?<=\s) # space
| # OR
(?<=^) # start-of-line metachar
)
[^:] # anything that is not a colon
\S+ # one or more characters that are not a space
\? # literal question mark
也会匹配\b
和:
之间的边界...没有bueno,因此是后视。
答案 1 :(得分:0)
替代方法
>>> string1="HI:MYDLKJL:ajkld? :JKLJBLKJD:DKJL? app?"
>>> string1.split()
['HI:MYDLKJL:ajkld?', ':JKLJBLKJD:DKJL?', 'app?']
# filter out elements not needed
>>> [s for s in string1.split() if not s.startswith(':')]
['HI:MYDLKJL:ajkld?', 'app?']
或者,使用regex模块
>>> string1="HI:MYDLKJL:ajkld? :JKLJBLKJD:DKJL? app?"
>>> regex.findall(r'(?:^|\s):\S+(*SKIP)(*F)|\S+', string1)
['HI:MYDLKJL:ajkld?', 'app?']
(?:^|\s):\S+(*SKIP)(*F)
将有效地忽略以:
(?:
表示non-capturing group