您可以从字符串创建Python列表,同时将特定关键字中的字符保持在一起吗?

Dan*_*ino 32 python python-2.7

我想从字符串中的字符创建一个列表,但保持特定的关键字在一起.

例如:

关键词:汽车,公交车

INPUT:

"xyzcarbusabccar"
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

["x", "y", "z", "car", "bus", "a", "b", "c", "car"]
Run Code Online (Sandbox Code Playgroud)

tim*_*geb 38

随着re.findall.首先在关键字之间进行替换.

>>> import re
>>> s = "xyzcarbusabccar"
>>> re.findall('car|bus|[a-z]', s)
['x', 'y', 'z', 'car', 'bus', 'a', 'b', 'c', 'car']
Run Code Online (Sandbox Code Playgroud)

如果您有重叠的关键字,请注意此解决方案将找到您遇到的第一个:

>>> s = 'abcaratab'
>>> re.findall('car|rat|[a-z]', s)
['a', 'b', 'car', 'a', 't', 'a', 'b']
Run Code Online (Sandbox Code Playgroud)

您可以通过[a-z]用您喜欢的任何内容替换该部分来使解决方案更加通用,\w例如,或者简单.地匹配任何字符.

简要说明为什么这样做以及为什么正则表达式'[a-z]|car|bus'不起作用:正则表达式引擎从左到右尝试交替选项并且" 急于 "返回匹配.这意味着只要其中一个选项完全匹配,它就会认为整个交替匹配.此时,它不会尝试任何剩余的选项,而是停止处理并立即报告匹配.使用时'[a-z]|car|bus',引擎会在看到字符类[az]中的任何字符时报告匹配,并且永远不会检查"car"或"bus"是否也可以匹配.

  • @SuperBiasedMan谢谢.它将是''|'.join(keywords)+'| [az]'`,但顺序是关键的,因为正则表达式引擎从左到右尝试替代方案并且*急于*返回匹配.这就是解决方案有效的原因,也许我应该在解释中编辑. (2认同)

Pad*_*ham 16

s = "xyzcarbusabccar"
import re

print re.findall("bus|car|\w", s)
['x', 'y', 'z', 'car', 'bus', 'a', 'b', 'c', 'car']
Run Code Online (Sandbox Code Playgroud)

或者也许\S对于任何非空白字符:

s = "xyzcarbusabccar!"
import re

print re.findall("bus|car|\S", s)
['x', 'y', 'z', 'car', 'bus', 'a', 'b', 'c', 'car', '!']
Run Code Online (Sandbox Code Playgroud)

如果你想要最长的匹配,只要确保你的订单正确,请先输入更长的单词.

In [7]: s = "xyzcarsbusabccar!"

In [8]: re.findall("bus|car|cars|\S", s)
Out[8]: ['x', 'y', 'z', 'car', 's', 'bus', 'a', 'b', 'c', 'car', '!']

In [9]: re.findall("bus|cars|car|\S", s)
Out[9]: ['x', 'y', 'z', 'cars', 'bus', 'a', 'b', 'c', 'car', '!']
Run Code Online (Sandbox Code Playgroud)