使用正则表达式匹配特定模式直到匹配停止

10

我有一个文本文件中包含以下文本的字符串:

txt = "java.awt.GridBagLayout.layoutContainer"

我想获取类名 "GridBagLayout" 之前的所有内容。

我尝试了以下代码,但是不知道怎么去掉 "."

txt = re.findall(r'java\S?[^A-Z]*', txt)

我得到了下面的结果:"java.awt."

而我想要的是:"java.awt"

你有什么建议可以帮助我解决这个问题吗?


1
你可以使用 txt.rstrip('.') 来删除文本末尾的句号。 - Felix Kling
如何用简单的 txt.split('.')[0:2] 代码? - Fredrik Pihl
3个回答

19

不使用捕获组,你可以使用向前查看((?= ... ))。

java\s?[^A-Z]*(?=\.[A-Z]) 可以捕获你想要的所有内容。下面是它的详细解释:

java            //Literal word "java"
\s?             //Match for an optional space character. (can change to \s* if there can be multiple)
[^A-Z]*         //Any number of non-capital-letter characters
(?=\.[A-Z])     //Look ahead for (but don't add to selection) a literal period and a capital letter.

非常感谢!我对前瞻性的事情感到困惑,但是你分解的方式帮了我很多! - newdev14
没问题。我有一个建议 - 如果你再次需要正则表达式的帮助,可以试试regular-expressions.info,并查看他们的“高级正则表达式语法”部分。 :) - Nightfirecat
如果 txt = java.awt 怎么办?你如何使前瞻变成可选项?谢谢! - tommy.carstensen
@tommy.carstensen 如果在您的用例中,前瞻是可选的,那么它可以被移除。这很大程度上取决于您的输入和期望输出,但简单地移除前瞻可能已经足够了。 - Nightfirecat

0

让您的模式匹配一个大写字母后面跟着一个句号:

'(java\S?[^A-Z]*?)\.[A-Z]'

捕获组一中的所有内容都是您想要的。


我认为应该是(java\S?[^A-Z]*?)\.[A-Z](想法上 ? 可能不是必要的,但也不会有害 ;)) - Felix Kling

0

使用re.findall()似乎可以实现您想要的功能:(java\S?[^A-Z]*)\.[A-Z]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接