Python 中有没有办法在同一行中执行 if 重新匹配和分组捕获?
在 PERL 中,我会这样做:
my $line = "abcdef";
if ($line =~ m/ab(.*)ef/) {
print "$1\n";
}
Run Code Online (Sandbox Code Playgroud)
输出:
badger@pi0: scripts $ ./match.py
cd
Run Code Online (Sandbox Code Playgroud)
但我能在 Python 中找到的最接近的方法是这样的:
import re
line = 'abcdef'
if re.search('ab.*ef', line):
match = re.findall('ab(.*)ef', line)
print(match[0])
Run Code Online (Sandbox Code Playgroud)
输出:
badger@pi0: scripts $ ./match.pl
cd
Run Code Online (Sandbox Code Playgroud)
这似乎必须进行两次比赛。
我有三个字符串,其中包含街道名称和公寓号的信息。
"32 Syndicate street","Street 45 No 100"和"15, Tom and Jerry Street"
这里,
"32 Syndicate street" -> {"street name": "Syndicate street", "apartment number": "32"}
"Street 45 No 100" -> {"street name": "Street 45", "apartment number": "No 100"}
"15, Tom and Jerry Street" -> {"street name": "Tom and Jerry Street", "apartment number": "15"}
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用 Python 的正则表达式分别获取街道名称和公寓号。这是我当前的代码,它有问题:
import re
for i in ["32 Syndicate street","Street 45 No 100","15, Tom and Jerry Street"]:
###--- write patterns for street names
pattern_street …Run Code Online (Sandbox Code Playgroud) 我正在学习rePython 的“ ”部分,命名模式(?P=name)让我感到困惑,
当我用来re.sub()进行数字和字符的交换时,模式“ (?P=name)”不起作用,但模式“ \N”和“ \g<name>”仍然有意义。代码如下:
[IN]print(re.sub(r'(?P<digit>\d{3})-(?P<char>\w{4})', r'(?P=char)-(?P=digit)', '123-abcd'))
[OUT] (?P=char)-(?P=digit)
[IN] print(re.sub(r'(?P<digit>\d{3})-(?P<char>\w{4})', r'\2-\1', '123-abcd'))
[OUT] abcd-123
[IN] print(re.sub(r'(?P<digit>\d{3})-(?P<char>\w{4})', r'\g<char>-\g<digit>', '123-abcd'))
[OUT] abcd-123
Run Code Online (Sandbox Code Playgroud)
为什么我使用时无法进行替代(?P=name)?
以及如何正确使用呢?
我正在使用Python 3.5
我想删除从+到 的所有内容@,包括+,但不删除@
我所能得到的最接近的是在正则表达式之间使用它。
>>> email = "garry+filter@gmail.com"
>>> re.sub(r'\+[^)]*\@', '', email)
garrygmail.com
Run Code Online (Sandbox Code Playgroud) 我目前正在研究正则表达式并遇到了一个查询。所以问题的标题是我想要找出的。我认为因为\s代表一个空白,re.split(" ", string)并且re.split("\s+", string)会给出相同的值,如下所示:
>>> import re
>>> a = re.split(" ", "Why is this wrong")
>>> a
["Why", "is", "this", "wrong"]
Run Code Online (Sandbox Code Playgroud)
>>> import re
>>> a = re.split("\s+", "Why is this wrong")
>>> a
["Why", "is", "this", "wrong"]
Run Code Online (Sandbox Code Playgroud)
这两个给出了相同的答案,所以我认为它们是同一回事。然而,事实证明这些是不同的。在什么情况下会有所不同?我在这里错过了什么让我失明?
我目前有用于解析 Markdown 文本的 Python 代码,以便提取 Markdown 链接的方括号内的内容以及超链接。
import re
# Extract []() style links
link_name = "[^]]+"
link_url = "http[s]?://[^)]+"
markup_regex = f'\[({link_name})]\(\s*({link_url})\s*\)'
for match in re.findall(markup_regex, '[a link](https://www.wiki.com/atopic_(subtopic))'):
name = match[0]
url = match[1]
print(url)
# url will be https://wiki.com/atopic_(subtopic
Run Code Online (Sandbox Code Playgroud)
这将无法获取正确的链接,因为它匹配第一个括号,而不是最后一个。
我怎样才能使正则表达式尊重直到最后一个括号?
假设我有以下字符串:
\nstr = """\n HELLO 1 Stop #$**& 5.02\xe2\x80\xbc\xef\xb8\x8f 16.1 \n regex\n\n 5 ,#2.3222\n """\nRun Code Online (Sandbox Code Playgroud)\n我想导出“stop”一词后面的所有数字,无论是int还是float,不区分大小写。所以预期结果将是:
\n[5.02, 16.1, 5, 2.3222]\nRun Code Online (Sandbox Code Playgroud)\n到目前为止,我走得最远的是使用其他帖子中的 PyPi 正则表达式:
\nregex.compile(r'(?<=stop.*)\\d+(?:\\.\\d+)?', regex.I)\nRun Code Online (Sandbox Code Playgroud)\n但这个表达式只给我 [5.02, 16.1]
\nimport re
def multi_vowel_words(text):
pattern =r"\b\w[aeiou]{3,},?\s?.*\w[aeiou]{3,}.*\b"
result = re.findall(pattern, text)
return result
Run Code Online (Sandbox Code Playgroud)
我哪里做错了
运行我的代码后我得到这个:
[]
['queen is courageous and gracious']
['quietly and await their delicious dinner']
[]
[]
#below this are desired outputs
print(multi_vowel_words("Life is beautiful"))
# ['beautiful']
print(multi_vowel_words("Obviously, the queen is courageous and
gracious."))
# ['Obviously', 'queen', 'courageous', 'gracious']
print(multi_vowel_words("The rambunctious children had to sit quietly and
await their delicious
dinner."))
# ['rambunctious', 'quietly', 'delicious']
print(multi_vowel_words("The order of a data queue is First In First Out
(FIFO)"))
# ['queue'] …Run Code Online (Sandbox Code Playgroud) 我正在学习 python regex 并想知道如何从中提取数字
x days y hours z minutes?
注意:没有月或秒,只允许天、分和秒中的一个或多个。
import re
s1 = '5 days 19 hours 30 minutes'
s2 = '5 days'
s3 = '19 hours'
s4 = '5 days 19 hours'
pat = r'((\d+)(?<=\sdays))?((\d+)(?<=\shours))?((\d+)(?<=\sminutes))?'
d,h,m = re.findall(pat,s)
Note: 2 days 3 hours ==> d=2 h=3
2 hours 3 minutes ==> h=2 m=3
Run Code Online (Sandbox Code Playgroud)
我正在努力修复lookbehinds。如何解决问题?
我第一次学习 re 模块但遇到了错误。
代码-
import re
my_str='''pyhton
c++
java
c++
js node
ds algo
pyhton
js node
javac++
java
js node
ds algo'''
var = re.findall("c++",my_str)
Run Code Online (Sandbox Code Playgroud)
它给出了错误 -re.error: multiple repeat at position 2