我坚持做这样的事情......
来自
{Hi|Hello} I am - {Me|You|Us}
到此
#Possible results
'Hi I am - You'
'Hello I am - Me'
'Hi I am - Us'
'Hello I am - You'
基本上,代码将搜索包含在花括号{} 中的单词。那些花括号里面有多个单词,可以分开。总而言之,每个花括号将仅输出单词,它将随机选择。
我需要正则表达式吗?我试着寻找预制的图书馆,但我刚发现一个过时的图书馆。有人可以帮忙吗?
答案 0 :(得分:0)
试试这个:
Tintadgel:~ dhoelzer$ python
Python 2.7.2 (default, Oct 11 2012, 20:14:37)
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> p = re.compile('(Hi|Hello) I am - (Me|You|Us)')
>>> print p.match("Hi I am - You")
<_sre.SRE_Match object at 0x106481470>
>>> p.match("Hi I am - Yo")
>>>
这是发生了什么。我们首先导入正则表达式库。完成后,我们接下来编译一个正则表达式,该表达式查找以“Hi”或“Hello”开头的字符串,并以以下之一结束:Me,You和Us。
通过创建,我们现在可以直接对它进行匹配。请注意print p.match("Hi I am - You")
返回一个对象。这意味着我们有一场比赛!相反,p.match("Hi I am - Yo")
不返回任何内容,表示找不到匹配项。
希望这有帮助!您可能需要查看http://docs.python.org/2/howto/regex.html
答案 1 :(得分:0)
如果您的输入相对简单 - {
和}
的唯一出现是为了提供多个可能的文本片段,如问题中所示 - 您可以使用像这样的正则表达式以下内容:
import re
p = re.compile('(\{[^\}]+\}|[^\{\}]*)')
然后你将文本拆分成这样的片段:
frags = p.split("{Foo|Bar} baz {quux|wibble}.")
# ['', '{Foo|Bar}', '', ' baz ', '', '{quux|wibble}', '', '.', '']
对于此列表中的每个字符串,您可以生成可能值的列表(对于不以{
开头的字符串,只能生成一个值):
def options(s):
if len(s) > 0 and s[0] == '{':
return [opt for opt in s[1:-1].split('|')]
return [s]
options("foo")
# ["foo"]
options("{foo|bar}")
# ["foo", "bar"]
然后建立一个选项列表列表:
opt_lists = [options(frag) for frag in frags]
然后构建笛卡尔积并加入:
import itertools
for spec in itertools.product(*opt_lists):
print(''.join(spec))
这里是"{Foo|Bar} baz {quux|wibble}."
示例的输出:
Foo baz quux.
Foo baz wibble.
Bar baz quux.
Bar baz wibble.
如果输入中存在其他复杂性,则可能需要使用更复杂的正则表达式或解析器作为实际输入格式,但是生成选项列表列表作为中间结果的一般想法仍然有效。< / p>