通过regexp筛选python中以特定字符(所有出现)结尾的文本

2024-05-13 17:37:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用python过滤文本

import re
text = "Fast charging 25W, USB Power Delivery 3.0, Fast Qi/PMA wireless charging 12W, Reverse wireless charging 4.5W"
regex = re.compile("\w+\s\w+harg\w+\s\d+W")  
mc = regex.findall(text)
print(mc)

结果是

['Fast charging 25W', 'wireless charging 12W']

但是,我要做的是让所有事件以*W结尾”

['Fast charging 125W', 'Fast Qi/PMA wireless charging 12W', 'Reverse wireless charging 4.5W']

数字可以大得多(如充电1250W) 我在谷歌上搜索了将近2个小时,搜索了很多关于regexp的文档,但都是徒劳的。任何帮助都将不胜感激

多谢各位


Tags: text文本importremcregexusbreverse
3条回答

您正在寻找单词边界,如果我理解正确,逗号之间的所有内容:

[^,]+?W\b
  • 一切都不是逗号,懒惰
  • 文字大写W,后跟单词边界\b

Online Demo, 代码示例:

import re
regex = r"[^,]+?W\b"
test_str = ("text = \"Fast charging 25W, USB Power Delivery 3.0, Fast Qi/PMA wireless charging 12W, Reverse wireless charging 4.5W\"\n")
matches = re.finditer(regex, test_str, re.MULTILINE)
for matchNum, match in enumerate(matches, start=1):  
    print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))

这将捕获前面有一个或多个数字的所有W

代码:

import re
text = "Fast charging 25W, USB Power Delivery 3.0, Fast Qi/PMA wireless charging 12W, Reverse wireless charging 4.5W"

pattern = '((\d[.])?\d+[W])'
matches = [match.group() for match in re.finditer(pattern, text)]
print(matches)

输出:

['25W', '12W', '4.5W']

您可以用一个单词字符开始匹配,在不是逗号的字符之间进行匹配,然后至少匹配W前面的一个数字

(?<!\S)[^,]*\bcharg\w+\b[^,]*\dW\b

解释

  • (?<!\S)在左侧断言空白边界
  • [^,]*匹配除,之外的任何字符的0+次出现次数
  • \bcharg\w+\b一个单词边界,匹配charg后跟1+单词字符和单词边界
  • [^,]*匹配除,之外的任何字符的0+次出现次数
  • \dW\b至少匹配一个后跟W和单词边界的单个数字

Regex demo

import re

s = "Fast charging 25W, USB Power Delivery 3.0, Fast Qi/PMA wireless charging 12W, Reverse wireless charging 4.5W, Charge 1250W"
print(re.findall(r"(?<!\S)[^,]*\bcharg\w+\b[^,]*\dW\b", s, re.IGNORECASE))

输出

[
    'Fast charging 25W',
    'Fast Qi/PMA wireless charging 12W',
    'Reverse wireless charging 4.5W',
    'Charge 1250W'
]

或者,如果在具有W的部分中只能有数字,则可以排除匹配的数字[^,\d],也可以选择匹配小数部分(?:\.\d+)?

(?<!\S)[^,]*\bcharg\w+\b[^,\d]*\d+(?:\.\d+)?W\b

Regex demo

相关问题 更多 >