Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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_Parsing - Fatal编程技术网

Python 短语需要正则表达式,包括中间的空格,但不包括右边的空格?

Python 短语需要正则表达式,包括中间的空格,但不包括右边的空格?,python,regex,parsing,Python,Regex,Parsing,我有一个日志文件,其中我们使用Python中的正则表达式解析每一行 每行的一部分包含一个短语,即一个或多个单词 例如,在下面的句子中,短语是“某个短语” 12-09-95 10:37:46082[3]INFO Foobar-1995-Dec-09 10:37:47.189025---[5571467078570868736::TYPE::SOME短语::1995-Dec-09 10:37.165672::1995-Dec-09 10:37:47.188790::00:00.023117] 在其

我有一个日志文件,其中我们使用Python中的正则表达式解析每一行

每行的一部分包含一个短语,即一个或多个单词

例如,在下面的句子中,短语是“某个短语”

12-09-95 10:37:46082[3]INFO Foobar-1995-Dec-09 10:37:47.189025---[5571467078570868736::TYPE::SOME短语::1995-Dec-09 10:37.165672::1995-Dec-09 10:37:47.188790::00:00.023117]
在其他行中,它可能只是一个单词,例如“短语”

12-09-95 10:37:46082[3]INFO Foobar-1995-Dec-09 10:37:47.189025---[5571467078570868736::TYPE::SOME短语::1995-Dec-09 10:37.165672::1995-Dec-09 10:37:47.188790::00:00.023117]
我们需要提取短语中的所有单词,包括单词之间的空格,但要减去单词左边或右边的空格

这个短语本身很简单-我们正则表达式的相关部分:

::(?P<phrase>[\w\s]+)::
:(?P[\w\s]+)::
然而,我不知道如何使用正则表达式丢弃右边的空白-日志文件通常在我们想要的短语后面有一堆无关的空格

我知道我可以在事后使用str.rstrip()删除它,但我更愿意使用正则表达式本身来简单地不拾取它-有没有办法做到这一点

干杯,
Victor

您无法像这样匹配尾随空格

::(?P<phrase>[\w\s]+?)\s*::
:(?P[\w\s]+?)\s*::
为什么要使用正则表达式

>>> line = "12-09-95 10:37:46,082 [3] INFO Foobar <> - 1995-Dec-09 10:37:47.189025 --- [5571467078570868736::TYPE    ::SOME PHRASE ::1995-Dec-09 10:37:47.165672::1995-Dec-09 10:37:47.188790::00:00:00.023117]"
>>> line.split('::')[2].strip()
'SOME PHRASE'
>>>line=“12-09-95 10:37:46082[3]INFO Foobar-1995-Dec-09 10:37:47.189025---[5571467078570868736::TYPE::SOME短语::1995-Dec-09 10:47.165672::1995-Dec-09 10:37:47.188790::00:00.023117]”
>>>line.split(“::”)[2].strip()
“一些短语”
>>p=re.compile('::\s*(?p(?::\w[\w\s]*)?\w)\s*:')
>>>p.findall(':test::test test:::s:::另一个测试:::第三个测试::'))
[‘测试’、‘s’、‘另一个测试’、‘第三个测试’]

这是通过确保短语以\w开头和结尾来实现的(即使只有一个\w)。我明白了,莱夫也是这样,但我无法解释他的工作原理,除非我付出比我愿意付出更多的努力(sleepy).

@Kobi:谢谢,会解决这个问题的。呵呵,我刚刚试过,它仍然会在词组后面加上多余的空格。例如,它将给出“somephrase”而不是“somephrase”。您应该有一个子匹配项“somephrase”。或者,尝试:(?P[\w\s]+?)(?:\s*):@Leif:Hmm,这似乎有效-您是否有机会向我解释它是如何工作的?如果子表达式以“?:”开头,则不会捕获它。这样你就更容易得到你想要的。我不知道python如何返回匹配,但我猜它是一个多维数组,允许您访问任何子匹配。你只需要知道指数。如果你打印出数组,你就会明白了。
::(?P<phrase>[\w\s]+?)\s*::
>>> line = "12-09-95 10:37:46,082 [3] INFO Foobar <> - 1995-Dec-09 10:37:47.189025 --- [5571467078570868736::TYPE    ::SOME PHRASE ::1995-Dec-09 10:37:47.165672::1995-Dec-09 10:37:47.188790::00:00:00.023117]"
>>> line.split('::')[2].strip()
'SOME PHRASE'
>>> p = re.compile('::\s*(?P<phrase>(?:\w[\w\s]*)?\w)\s*::')
>>> p.findall(': test :: test test :: ::  s  :: ::  another test:: ::third test   ::')
['test test', 's', 'another test', 'third test']