使用正则表达式解析字符串以获取以某个单词开头的匹配项

时间:2017-09-17 11:13:38

标签: python regex string

我试图搜索,但我得到的信息似乎有点压倒性而且远非我需要的。我似乎无法让它发挥作用。 要求是获得以“meta”及其括号开头的函数。

remove_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_related_products', 20 );

如果它以“meta”开头,那么我现在拥有的那条线就会获得整条线。所以我有整个“一元<>”如果这是一场比赛,我可以做到我的目标吗?

编辑:一次只有一个输入/行。

我很想发布我之前做的事情,但由于我的沮丧,我关闭了repl.it。我会在下一篇文章中记住这一点。 (这里很新)

3 个答案:

答案 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.compilere.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)')]