Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用正则表达式解析字符串以获取以某个单词开头的匹配项_Python_Regex_String - Fatal编程技术网

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

Python 使用正则表达式解析字符串以获取以某个单词开头的匹配项,python,regex,string,Python,Regex,String,我试图搜索,但我得到的信息似乎有点压倒性,远远不是我需要的。我似乎无法让它工作。 需求是获取以“meta”及其括号开头的函数 input: one metaOmph(uno) one metaAsdf(dos) one metaPoil(tres) output: [ metaOmph , (uno) ] [ metaAsdf, (dos) ] [ metaPoil, (tres)] 我现在看到的那一行,如果以“meta”开头,就会得到整行。所以我有一个完整的“一元”,如果它是一个匹配,

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

input:
one metaOmph(uno)
one metaAsdf(dos)
one metaPoil(tres)

output:
[ metaOmph , (uno) ]
[ metaAsdf,  (dos) ]
[ metaPoil,  (tres)]
我现在看到的那一行,如果以“meta”开头,就会得到整行。所以我有一个完整的“一元”,如果它是一个匹配,它可能做到我的目标吗

编辑:一次一个输入/行

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

产出:

[('metaOmph', '(uno)'), ('metaAsdf', '(dos)'), ('metaPoil', '(tres)')]
产出:

[('metaOmph', '(uno)'), ('metaAsdf', '(dos)'), ('metaPoil', '(tres)')]

如果要传递多行字符串,那么使用模块级
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)')]

如果要将单行字符串作为输入传递给循环,则在函数中使用
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'对象没有属性'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) 
)

如果要传递多行字符串,那么使用模块级
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)')]

如果要将单行字符串作为输入传递给循环,则在函数中使用
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'对象没有属性'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) 
)
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)')]
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)')]


你应该在这里加上你尝试过的东西。很明显,你尝试了一些东西,但没有成功。你应该在这里添加,你尝试了什么。很明显,你尝试了一些东西,但没有成功。谢谢!是否可以使用re.match?每个btw的输入为一行。。对不起,我忘了说that@AndrewNguyen事实上,这是行不通的——理由很充分。如果一个单词以meta结尾,它也将被视为假阳性。我计算了你的分数,谢谢你的报复否决票:)谢谢!是否可以使用re.match?每个btw的输入为一行。。对不起,我忘了说that@AndrewNguyen事实上,这是行不通的——理由很充分。如果一个单词以meta结尾,它也将被视为假阳性。我计算了你的分数,感谢你的报复性否决投票:)嘿,酷毙了!谢谢你的帮助!我会继续复习的it@AndrewNguyen是的,我认为你应该能够从你正在做的事情中学习,而不是盲目地从一个半生不熟的答案中抄袭。我还更新了我的问题,以澄清这是一次一个输入。所以“一个metaOmph(uno)”将是第一个输入。@AndrewNguyen也为您添加了更多选项。您询问是否可以进行
re.match
。我认为
re.search
是你想要的。您可以选择附加到列表或按原样在循环中打印。@AndrewNguyen还注意到,虽然您在获得15个代表之前可能无法进行投票,但您可以接受最有帮助的答案。嘿,Coldspeed!谢谢你的帮助!我会继续复习的it@AndrewNguyen是的,我认为你应该能够从你正在做的事情中学习,而不是盲目地从一个半生不熟的答案中抄袭。我还更新了我的问题,以澄清这是一次一个输入。所以“一个metaOmph(uno)”将是第一个输入。@AndrewNguyen也为您添加了更多选项。您询问是否可以进行
re.match
。我认为
re.search
是你想要的。您可以选择附加到列表或按原样在循环中打印。@AndrewNguyen还注意到,虽然您在获得15个代表之前可能无法进行投票,但您可以接受最有帮助的答案。