解析具有各种特殊字符的消息并拆分为列表(re 和 regex)Python 2.7
Parsing a message with various special characters and splitting into a list (re and regex) Python 2.7
我正在尝试解析收到以下定界符(不带引号)的消息:
- 定界符 1:“@@@”- 后跟消息
- 定界符2:“!!!” - 信号
- 定界符 3:“---”- 后跟一条消息
- 定界符 4:“###”- 后跟消息
- 定界符 5:“$$$”- 后跟消息
我到目前为止:
import re
mystring = '@@@useradd---userfirstadded###userremoved!!!$$$message'
result = re.split('\@\@\@|\!\!\!|\---|\#\#\#|\$$$',mystring)
print result
我目前的成绩:
['', 'useradd', 'userfirstadded', 'userremoved', '', 'message']
我想将结果打印到控制台:
['@@@useradd','---userfirstadded','###userremoved','!!!','$$$message']
这可以使用 re.split 还是我需要使用 re.find 或更好的东西?如您所见,我一直在使用 re.split 分隔符,但也许你们在 python 中使用此功能有更多经验。
已编辑解决方案 #1 使用 re(来自@thefourtheye):
代码如下:
import re
mystring = '@@@useradd---userfirstadd%ed###this is my username@!!!$$$hey whats up how are you??@@@useradd$$$This is my email @gmail.com!!!'
result = re.findall(r'!!!|(?:@|-|#|$){3}[\w ^]+', mystring)
print result
打印结果如下:
['@@@useradd', '---userfirstadd', '###this is my username', '!!!', '$$$hey whats up how are you', '@@@useradd', '$$$This is my email ', '!!!']
已编辑新规范:
一切都按照上面指定的方式工作,更多使用下面@thefourtheye 建议的答案。如果该函数可能有更多功能,比如允许一个或两个分隔符或更多,那会更好,就好像用户想在消息中键入他的电子邮件地址一样,他会使用 @ 符号或美元金额和 $等。如果这不可能,我总是可以在消息或不同类型的消息。你有什么建议?
总结:我想添加接受所有字符的功能,直到完全命中定界符模式(即 @@@)否则接受所有可能的字符,包括定界符中的字符字符串中的模式(即@@@ 不会拆分字符串)这可能吗?
已编辑解决方案 #2 使用正则表达式(来自@hwnd):
Regex 未安装到 python 2.7(如果您正在使用它)。您需要下载并安装此软件包。这些是我采取的明确指示,因此您也可以这样做。
- 转到https://pypi.python.org/pypi/regex,页面底部有下载链接。单击 regex-2015.03.18-cp27-none-win32.whl for Windows operating systems that are 运行 Python 2.7(否则尝试其他的直到成功安装适合你)。
- 浏览到您刚刚下载的 .whl 文件的下载目录。 Shift+右键单击该目录中的任意位置并单击 "Open command window here" 然后键入 "pip install regex-2015.03.18-cp27-none-win32.whl" 并且应该显示 "Successfully installed!"
- 您现在可以使用正则表达式了!
代码如下:
import regex
mystring = '@@@useradd---userfirstadd%ed###this is my username@!!!$$$hey whats up how are you??@@@useradd$$$This is my email @gmail.com!!!'
result = filter(None, regex.split(r'(?V1)(!!!)|\s*(?=(?:@|$|#|-){3})', mystring))
print result
打印结果如下:
['@@@useradd', '---userfirstadd%ed', '###this is my username@', '!!!', '$$$hey whats up how are you??', '@@@useradd', '$$$This is my email @gmail.com', '!!!']
编辑: 由于您想保留模式定界符之间的所有字符,您可以使用 regex 模块来做到这一点,拆分为“!!!”并对其他零宽度匹配使用前瞻。
>>> import regex
>>> s = '@@@useradd---userfirstadd%ed###this is my username@!!!$$$hey whats up how are you??@@@useradd$$$This is my email @gmail.com!!!'
>>> filter(None, regex.split(r'(?V1)(!!!)|\s*(?=(?:@|$|#|-){3})', s))
['@@@useradd', '---userfirstadd%ed', '###this is my username@', '!!!', '$$$hey whats up how are you??', '@@@useradd', '$$$This is my email @gmail.com', '!!!']
如果将提供 5 个匹配组,请使用此正则表达式
(@{3}[a-z]+)(-{3}[a-z]+)(#{3}[a-z]+)(!{3})(\${3}[a-z] +)
我正在尝试解析收到以下定界符(不带引号)的消息:
- 定界符 1:“@@@”- 后跟消息
- 定界符2:“!!!” - 信号
- 定界符 3:“---”- 后跟一条消息
- 定界符 4:“###”- 后跟消息
- 定界符 5:“$$$”- 后跟消息
我到目前为止:
import re
mystring = '@@@useradd---userfirstadded###userremoved!!!$$$message'
result = re.split('\@\@\@|\!\!\!|\---|\#\#\#|\$$$',mystring)
print result
我目前的成绩:
['', 'useradd', 'userfirstadded', 'userremoved', '', 'message']
我想将结果打印到控制台:
['@@@useradd','---userfirstadded','###userremoved','!!!','$$$message']
这可以使用 re.split 还是我需要使用 re.find 或更好的东西?如您所见,我一直在使用 re.split 分隔符,但也许你们在 python 中使用此功能有更多经验。
已编辑解决方案 #1 使用 re(来自@thefourtheye):
代码如下:
import re
mystring = '@@@useradd---userfirstadd%ed###this is my username@!!!$$$hey whats up how are you??@@@useradd$$$This is my email @gmail.com!!!'
result = re.findall(r'!!!|(?:@|-|#|$){3}[\w ^]+', mystring)
print result
打印结果如下:
['@@@useradd', '---userfirstadd', '###this is my username', '!!!', '$$$hey whats up how are you', '@@@useradd', '$$$This is my email ', '!!!']
已编辑新规范:
一切都按照上面指定的方式工作,更多使用下面@thefourtheye 建议的答案。如果该函数可能有更多功能,比如允许一个或两个分隔符或更多,那会更好,就好像用户想在消息中键入他的电子邮件地址一样,他会使用 @ 符号或美元金额和 $等。如果这不可能,我总是可以在消息或不同类型的消息。你有什么建议?
总结:我想添加接受所有字符的功能,直到完全命中定界符模式(即 @@@)否则接受所有可能的字符,包括定界符中的字符字符串中的模式(即@@@ 不会拆分字符串)这可能吗?
已编辑解决方案 #2 使用正则表达式(来自@hwnd):
Regex 未安装到 python 2.7(如果您正在使用它)。您需要下载并安装此软件包。这些是我采取的明确指示,因此您也可以这样做。
- 转到https://pypi.python.org/pypi/regex,页面底部有下载链接。单击 regex-2015.03.18-cp27-none-win32.whl for Windows operating systems that are 运行 Python 2.7(否则尝试其他的直到成功安装适合你)。
- 浏览到您刚刚下载的 .whl 文件的下载目录。 Shift+右键单击该目录中的任意位置并单击 "Open command window here" 然后键入 "pip install regex-2015.03.18-cp27-none-win32.whl" 并且应该显示 "Successfully installed!"
- 您现在可以使用正则表达式了!
代码如下:
import regex
mystring = '@@@useradd---userfirstadd%ed###this is my username@!!!$$$hey whats up how are you??@@@useradd$$$This is my email @gmail.com!!!'
result = filter(None, regex.split(r'(?V1)(!!!)|\s*(?=(?:@|$|#|-){3})', mystring))
print result
打印结果如下:
['@@@useradd', '---userfirstadd%ed', '###this is my username@', '!!!', '$$$hey whats up how are you??', '@@@useradd', '$$$This is my email @gmail.com', '!!!']
编辑: 由于您想保留模式定界符之间的所有字符,您可以使用 regex 模块来做到这一点,拆分为“!!!”并对其他零宽度匹配使用前瞻。
>>> import regex
>>> s = '@@@useradd---userfirstadd%ed###this is my username@!!!$$$hey whats up how are you??@@@useradd$$$This is my email @gmail.com!!!'
>>> filter(None, regex.split(r'(?V1)(!!!)|\s*(?=(?:@|$|#|-){3})', s))
['@@@useradd', '---userfirstadd%ed', '###this is my username@', '!!!', '$$$hey whats up how are you??', '@@@useradd', '$$$This is my email @gmail.com', '!!!']
如果将提供 5 个匹配组,请使用此正则表达式
(@{3}[a-z]+)(-{3}[a-z]+)(#{3}[a-z]+)(!{3})(\${3}[a-z] +)