9
votes

I have string in a text file containing some text as follows:

txt = "java.awt.GridBagLayout.layoutContainer"

I am looking to get everything before the Class Name, "GridBagLayout".

I have tried something the following , but I can't figure out how to get rid of the "."

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

and I get the following: "java.awt."

instead of what I want: "java.awt"

Any pointers as to how I could fix this?

3
You could just trim the text, txt.rstrip('.'). - Felix Kling
how about a simple txt.split('.')[0:2] - Fredrik Pihl

3 Answers

18
votes

Without using capture groups, you can use lookahead (the (?= ... ) business).

java\s?[^A-Z]*(?=\.[A-Z]) should capture everything you're after. Here it is broken down:

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.
0
votes

Make your pattern match a period followed by a capital letter:

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

Everything in capture group one will be what you want.

0
votes

This seems to do what you want with re.findall(): (java\S?[^A-Z]*)\.[A-Z]