搜索字符串并仅返回我指定的内容

时间:2012-04-04 02:29:35

标签: python python-3.x

希望这篇文章更好......

所以我坚持这个程序的这个功能,它将返回指定某个关键字的整个单词。

ie - 如果我告诉它在字符串“blah blah blah blah I = 1mV blah blah等?”中查找单词“I =”,它会返回找到它的整个单词,所以在这种情况下,它会返回I = 1mV。

我尝试了很多不同的方法,例如,

text = "One of the values, I=1mV is used"
print(re.split('I=', text))

但是,这将返回相同的String而不包含I,因此它将返回

['One of the values, ', '1mV is used']

如果我尝试使用正则表达式解决方案,我会遇到数字可能超过1位数的问题,因此这个底部代码只有在数字为1位时才有效。如果I = 10mV是该值,它将只返回一个,但如果我有两次[/ 0-9],则代码不再仅使用1个值。

text = "One of the values, I=1mV is used"
print(re.findall("I=[/0-9]", text))

['I=1'] 

当我尝试使用re.match时,

text = "One of the values, I=1mV is used"
print(re.search("I=", text))

<_sre.SRE_Match object at 0x02408BF0>

检索单词的好方法是什么(在这种情况下,我想检索I = 1mV)并删除其余的字符串?

4 个答案:

答案 0 :(得分:2)

更好的方法是首先将文本拆分为单词:

>>> text = "One of the values, I=1mV is used"
>>> words = text.split()
>>> words
['One', 'of', 'the', 'values,', 'I=1mV', 'is', 'used']

然后过滤单词以找到您需要的单词:

>>> [w for w in words if 'I=' in w]
['I=1mV']

这将返回其中包含I=的所有单词的列表。然后我们可以找到第一个找到的元素:

>>> [w for w in words if 'I=' in w][0]
'I=1mV'

完成!我们可以做些什么来清理它只是寻找第一个匹配,而不是检查每个单词。我们可以使用生成器表达式:

>>> next(w for w in words if 'I=' in w)
'I=1mV'

当然,您可以调整if条件以更好地满足您的需求,例如,您可以使用str.startswith()检查单词是以某个字符串开头还是re.match()来检查这个词与模式匹配。

答案 1 :(得分:2)

使用字符串方法

对于记录,您尝试使用I=作为分隔符将字符串分成两半,几乎是正确的。您可以使用str.split()来保留它,而不是使用放弃分隔符的str.partition()

>>> my_text = "Loadflow current was I=30.63kA"
>>> my_text.partition("I=")
('Loadflow current was ', 'I=', '30.63kA')

使用正则表达式

更灵活,更强大的解决方案是使用正则表达式:

>>> import re
>>> pattern = r"""
... I=             # specific string "I="
... \s*            # Possible whitespace
... -?             # possible minus sign
... \s*            # possible whitespace
... \d+            # at least one digit
... (\.\d+)?       # possible decimal part
... """
>>> m = re.search(pattern, my_text, re.VERBOSE)
>>> m
<_sre.SRE_Match object at 0x044CCFA0>
>>> m.group()
'I=30.63'

这说明了更多的可能性(负数,整数或十进制数)。

请注意使用:

  • 量词表示你想要的每件事有多少。
    • a* - 零个或多个a s
    • a+ - 至少一个a
    • a? - “可选” - 一个或零a s
  • 带有注释的详细正则表达式(re.VERBOSE标志) - 比非详细等效词I=\s?-?\s?\d+(\.\d+)更容易理解上面的模式。
  • 正则表达式模式的原始字符串,r"..."而不是普通字符串"..." - 表示不必转义文字反斜杠。这里不需要,因为我们的模式不使用反斜杠,但有一天你需要匹配C:\Program Files\...,那一天你将需要原始字符串。

锻炼

  • 练习1:你如何扩展它以便它也可以匹配单位?您如何扩展它以使其可以与mAAkA匹配?提示:“轮换操作员”。

  • 练习2:如何扩展它以便它可以匹配工程符号中的数字,即“1.00e3”或“-3.141e-4”?

答案 2 :(得分:1)

import re
text = "One of the values, I=1mV is used"
l = (re.split('I=', text))
print str(l[1]).split(' ') [0]

如果您有多个I=,则对于每个奇数索引执行以上操作,其中0是第一个。

这是一个好方法,因为可以写“其中一个值,I = 1mV使用” 而且我想你想得到我是1mv。

BTW我是最新的,其单位是安培而不是伏特:)

答案 3 :(得分:1)

使用re.findall尝试,您需要添加一个+,这意味着一个或多个 以下是一些例子:

import re

test = "This is a test with I=1mV, I=1.414mv, I=10mv and I=1.618mv."

result = re.findall(r'I=[\d\.]+m[vV]', test)

print(result)

test = "One of the values, I=1mV is used"

result = re.search(r'I=([\d\.]+m[vV])', test)

print(result.group(1))

第一张照片是:['I=1mV', 'I=1.414mv', 'I=10mv', 'I=1.618mv']

我在re.search示例中对I=以外的所有内容进行了分组 所以第二个印刷品是:1mV
如果您有兴趣提取它。