我试图搜索,但我得到的信息似乎有点压倒性而且远非我需要的。我似乎无法让它发挥作用。 要求是获得以“meta”及其括号开头的函数。
remove_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_related_products', 20 );
如果它以“meta”开头,那么我现在拥有的那条线就会获得整条线。所以我有整个“一元<>”如果这是一场比赛,我可以做到我的目标吗?
编辑:一次只有一个输入/行。
我很想发布我之前做的事情,但由于我的沮丧,我关闭了repl.it。我会在下一篇文章中记住这一点。 (这里很新)
答案 0 :(得分:0)
import re
s = """one metaOmph(uno)
one metaAsdf(dos)
one metaPoil(tres)"""
print(re.findall(".+(meta\w+)(\(\w+\))", s))
输出:
[('metaOmph', '(uno)'), ('metaAsdf', '(dos)'), ('metaPoil', '(tres)')]
答案 1 :(得分:0)
如果要传递多行字符串,使用模块级re.findall
函数似乎很简单。
text = '''one metaOmph(uno)
one metaAsdf(dos)
one metaPoil(tres)'''
r = re.findall(r'\b(meta.*?)(\(.*?\))', text, re.M)
print(r)
[('metaOmph', '(uno)'), ('metaAsdf', '(dos)'), ('metaPoil', '(tres)')]
如果您要将1行字符串作为循环的输入传递,那么在函数内使用re.compile
和re.search
预先编译模式可能更有意义:
pat = re.compile(r'\b(meta.*?)(\(.*?\))')
def find(text):
return pat.search(text)
for text in list_of_texts: # assuming you're passing in your strings from a list, or elsewhere
m = find(text)
if m:
print(list(m.groups()))
['metaOmph', '(uno)']
['metaAsdf', '(dos)']
['metaPoil', '(tres)']
请注意,m
可能会返回match
个对象或 None
,具体取决于是否找到了搜索。您需要查询返回值,否则您将收到AttributeError: 'NoneType' object has no attribute 'groups'
或类似的内容。
或者,如果要将结果附加到列表,则可以使用:
r_list = []
for text in list_of_texts:
m = find(text)
if m:
r_list.append(list(m.groups()))
print(r_list)
[['metaOmph', '(uno)'], ['metaAsdf', '(dos)'], ['metaPoil', '(tres)']]
正则表达式详细信息
\b # word boundary (thought to add this in thanks to Roman's answer)
(
meta # literal 'meta'
.*? # non-greedy matchall
)
(
\( # literal opening brace (escaped)
.*?
\) # literal closing brace (escaped)
)
答案 2 :(得分:0)
re.findall()
使用有效的正则表达式模式:
import re
s = '''
one metaOmph(uno)
one metaAsdf(dos)
one metaPoil(tres)
'''
result = re.findall(r'\b(meta\w+)(\([^()]+\))', s)
print(result)
输出:
[('metaOmph', '(uno)'), ('metaAsdf', '(dos)'), ('metaPoil', '(tres)')]