I am currently learning Python and I wrote the following code.
The code searches the string for all digits that appear after ',
, sorts them and joins them into a string.
I have a strong feeling that it can be shortened...
Can anyone suggest how?
s = "'bhhd',12 'kjubk',2 'bjki',98 'khjbjj',4"
res = re.findall(r"(',)(\d+)", s)
all = []
for r in res:
all.append(r[1])
print(",".join(sorted(all, key=int)))
1 Answer 1
re.findall()
behaves differently depending on whether the regex contains capturing parentheses. If it doesn't contain capturing parentheses, then it just returns the matching text as a flat list.
So, how can you avoid capturing? Just rewrite your regex to use a positive lookbehind assertion.
s = "'bhhd',12 'kjubk',2 'bjki',98 'khjbjj',4"
all = re.findall(r"(?<=',)\d+", s)
print(",".join(sorted(all, key=int)))
-
\$\begingroup\$ thanks - I thought of that this morning! I am understanding that otherwise (i.e. if I wanted both captures), the way I wrote it is as they say the 'pythonic' way ...? \$\endgroup\$DaveyD– DaveyD2017年11月17日 17:54:59 +00:00Commented Nov 17, 2017 at 17:54
-
1\$\begingroup\$ If you want to capture, then you should use a list comprehension to build
all
. \$\endgroup\$200_success– 200_success2017年11月17日 18:25:45 +00:00Commented Nov 17, 2017 at 18:25 -
\$\begingroup\$ thanks! I thought that would be the direction but I wasnt sure how. I think I figured it out - the following code works, did I write it well? Let me know, thanks, David.
all = [r[1] for r in re.findall(r"(',)(\d+)"]
\$\endgroup\$DaveyD– DaveyD2017年11月19日 01:06:07 +00:00Commented Nov 19, 2017 at 1:06 -
\$\begingroup\$ That's fine.
re.finditer()
might be slightly better in that case. \$\endgroup\$200_success– 200_success2017年11月19日 01:46:43 +00:00Commented Nov 19, 2017 at 1:46 -
\$\begingroup\$ Ok, thanks. I got that to work but I am not sure why that might be any better... Can you explain? Thanks! \$\endgroup\$DaveyD– DaveyD2017年11月20日 00:06:52 +00:00Commented Nov 20, 2017 at 0:06