1

我正在处理其中的数据...

*标记属性 A
**标记属性 B
***标记属性 A 和 B

text1 = "spam*eggs"   # A
text2 = "eggs**spam"  # B
text3 = "spam***spam" # A & B

测试属性 B 很容易,

"**" in <string>

但是用相同的策略测试属性 A 会对 text2 产生误报。

>>> "*" in text2
True

我想测试属性A。有没有一种pythonic方法可以在不使用正则表达式的情况下做到这一点?我不想使用正则表达式,因为我与不熟悉它的初学者程序员共享代码。

4

5 回答 5

2

如果没有 Regex,您可以执行以下操作:

if "***" in mystr:
    print "Property A & B"
elif "**" in mystr:
    print "Property B"
elif "*" in mystr:
    print "Property A"
于 2013-10-21T15:43:27.417 回答
2

尝试这个:

idx = txt.index('*')
if txt[idx+1] != '*':
    print 'A'
elif txt[idx+2] != '*':
    print 'B'
else:
    print 'A & B'

The above will raise exceptions for the corner cases - for example, if the string is not present, or if the string is the last character. This solution has the added benefit of performing a single traversal of the text (the call to index()).

于 2013-10-21T15:41:27.043 回答
0

好吧,我不会说它是 Pythonic,但您可以将它们分组并确保连续出现的长度具有一定的长度 - 例如排除 1 或 3 **,例如:

from itertools import groupby
print any(k=='*' and len(list(g)) in (1, 3) for k, g in groupby(s))
于 2013-10-21T16:07:10.267 回答
0

您可以计算“*”的出现次数:

>>> text1.count('*')
1
>>> text2.count('*')
2
>>> text3.count('*')
3

所以你的支票是text.count('*') in (1, 3)

也就是说,我同意评论者的观点——正则表达式适合这类问题。

>>> properties = {1: 'A', 2: 'B', 3: 'A & B'}
>>> import re
>>> text = 'eggs***spam'
>>> match = re.search(r'\*+', text)
>>> if match:
...    print properties[len(match.group(0))]
... else:
...    print 'None'
A & B
于 2013-10-21T15:40:06.493 回答
-1

目前尚不清楚您是否只想测试文本中的属性 A,或者标题中的 A 或 C。(C是A和B)

要获得Trueor False1 或 3 而不是 2,您可以使用代码改写您的逻辑:

result = '***' in x or (not  '**' in x and '*' in x)

ABC根据模式获取字母:

result = ['None','A','B','C'][('*' in x) + ('**' in x) + ('***' in x)]

只测试属性 A(一星)而不会在两三点上失败。(编辑:简化了。如果**不存在,那么也不存在***):

isItA = '*' in x and not  '**' in x
于 2013-10-21T18:31:23.823 回答