为什么我写的正则表达式不能正常工作?

Yu *_* Gu 2 python regex

pattern = '(ns:m\.[^ ]+ )|(ns:g\.[^ ]+ )'
query = "PREFIX ns: <http://rdf.freebase.com/ns/>\nSELECT DISTINCT ?x\nWHERE {\nFILTER (?x != ns:m.0pz91)\nFILTER (!isLiteral(?x) OR lang(?x) = '' OR langMatches(lang(?x), 'en'))\nns:m.0pz91 ns:film.producer.film ?x .\n?x ns:film.film.genre ?c .\n?c ns:film.film_genre.films_in_this_genre ns:g.11b5lzm6b0 . \n}"
entities = re.findall(pattern, query)
Run Code Online (Sandbox Code Playgroud)

我所试图做的是找到我的查询,即所有的游离碱的实体,'ns:g.11b5lzm6b0''ns:m.0pz91'在我的例子。但是,我编写的代码返回[('ns:m.0pz91)\nFILTER ', ''), ('ns:m.0pz91 ', ''), ('', 'ns:g.11b5lzm6b0 ')]而不是['ns:m.0pz91 ', 'ns:g.11b5lzm6b0 '].
我通过使用 2 个单独的正则表达式解决了这个问题,即,ns:m\.[^ ]+ns:g\.[^ ]+,但是,我仍然不明白为什么我不能直接使用(ns:m\.[^ ]+ )|(ns:g\.[^ ]+ )来匹配ns:m\.[^ ]+ns:g\.[^ ]+

abh*_*ilb 5

您的正则表达式不起作用\n,因为您正在匹配任何不是space 演示的内容

可以参考demo url右侧的说明。

相反,你可以尝试

(ns:[mg]\.\w+)
Run Code Online (Sandbox Code Playgroud)

演示

更新

原始正则表达式的输出中存在元组的原因?

文档说:

如果模式有多个组,这将是一个元组列表

并且您的正则表达式有两个捕获组。