Python 可被3整除的正则表达式筛选器数

Python 可被3整除的正则表达式筛选器数,python,regex,Python,Regex,我有一个逗号分隔的ID(数字)列表。我只需要得到可以被3整除的 示例: i=“34543534353345352343422343242…”如果您真正指的是数字(而不是数字),这与 re.findall(r'[369]', my_str) 对于数字列表,不使用正则表达式非常简单: lst = "55,62,12,72,55" print [x for x in lst.split(',') if int(x) % 3 == 0] 如果你真的是指数字(不是数字),这很简单 re.finda

我有一个逗号分隔的ID(数字)列表。我只需要得到可以被3整除的

示例:
i=“34543534353345352343422343242…”

如果您真正指的是数字(而不是数字),这与

 re.findall(r'[369]', my_str)
对于数字列表,不使用正则表达式非常简单:

lst = "55,62,12,72,55"
print [x for x in lst.split(',') if int(x) % 3 == 0]
如果你真的是指数字(不是数字),这很简单

 re.findall(r'[369]', my_str)
对于数字列表,不使用正则表达式非常简单:

lst = "55,62,12,72,55"
print [x for x in lst.split(',') if int(x) % 3 == 0]

只是为了见鬼:

reobj = re.compile(
    r"""\b            # Start of number
    (?:               # Either match...
     [0369]+          # a string of digits 0369
    |                 # or
     [147]            # 1, 4 or 7
     (?:              # followed by
      [0369]*[147]    # optional 0369s and one 1, 4 or 7
      [0369]*[258]    # optional 0369s and one 2, 4 or 8
     )*               # zero or more times,
     (?:              # followed by
      [0369]*[258]    # optional 0369s and exactly one 2, 5 or 8
     |                # or
      [0369]*[147]    # two more 1s, 4s or 7s, with optional 0369s in-between.
      [0369]*[147]
     )
    |                 # or the same thing, just the other way around,
     [258]            # this time starting with a 2, 5 or 8
     (?:
      [0369]*[258]
      [0369]*[147]
     )*
     (?:
      [0369]*[147]
     |
      [0369]*[258]
      [0369]*[258]
     )
    )+                # Repeat this as needed
    \b                # until the end of the number.""", 
    re.VERBOSE)
result = reobj.findall(subject)

将查找字符串中可被3整除的所有数字。

只是为了检查一下:

reobj = re.compile(
    r"""\b            # Start of number
    (?:               # Either match...
     [0369]+          # a string of digits 0369
    |                 # or
     [147]            # 1, 4 or 7
     (?:              # followed by
      [0369]*[147]    # optional 0369s and one 1, 4 or 7
      [0369]*[258]    # optional 0369s and one 2, 4 or 8
     )*               # zero or more times,
     (?:              # followed by
      [0369]*[258]    # optional 0369s and exactly one 2, 5 or 8
     |                # or
      [0369]*[147]    # two more 1s, 4s or 7s, with optional 0369s in-between.
      [0369]*[147]
     )
    |                 # or the same thing, just the other way around,
     [258]            # this time starting with a 2, 5 or 8
     (?:
      [0369]*[258]
      [0369]*[147]
     )*
     (?:
      [0369]*[147]
     |
      [0369]*[258]
      [0369]*[258]
     )
    )+                # Repeat this as needed
    \b                # until the end of the number.""", 
    re.VERBOSE)
result = reobj.findall(subject)
将查找字符串中可被3整除的所有数字。

使用我得到的想法:

但是您不想在这个任务中使用正则表达式。

使用我的想法:


但是您不想在这个任务中使用正则表达式。

一个很有希望的完整版本,来自DEA的reduce[1]:

^([0369]|[147][0369]*[258]|(([258]|[147][0369]*[147])([0369]|[258][0369]*[147])*([147]|[258][0369]*[258])))+$
[1::

注:图4中有一个输入错误:从
q_i
到自身的转换应为
ce*b
,而不是
ce*d

一个有希望的完整版本,来自DEA的缩减[1]:

^([0369]|[147][0369]*[258]|(([258]|[147][0369]*[147])([0369]|[258][0369]*[147])*([147]|[258][0369]*[258])))+$
[1::


注:图4中有一个输入错误:从
q_i
到自身的转换应为
ce*b
,而不是
ce*d

正则表达式对于根据字符串匹配模式很有用。不是因为做数学。用逗号分割字符串,然后在可除3条件下过滤结果列表会容易得多。请发布更多信息,例如输入和输出示例。我没有尝试任何内容,因为我找不到任何感兴趣的内容。我确信这一个被错误地标记为
regex
,不过,找到一个正则表达式解决方案(如果存在的话)会很有趣。正则表达式对于匹配模式和字符串很有用。不是因为做数学。用逗号分割字符串,然后在可除3条件下过滤结果列表会容易得多。请发布更多信息,例如输入和输出示例。我没有尝试任何内容,因为我找不到任何感兴趣的内容。我确信这一个被错误地标记为
regex
,不过,如果存在正则表达式解决方案的话,找到它会很有意思。零不就属于那里吗?+1既属于thg435的答案,也属于eumiro,因为0确实可以被任何非零整数整除。此外,根据最近对问题的编辑,您可能需要在
(逗号空间)上拆分,而不仅仅是
。@Martin,你可能不应该使用“10x”,至少是math.stackexchange.com,除非你想把人搞糊涂。@Martin-一个建议:虽然我非常喜欢正则表达式,但这肯定是更好的答案,如果你能避免正则表达式,你应该接受它。零不是属于那里吗?+1是thg435和eumiro的答案,因为0确实可以被任何非零整数整除。此外,你可能需要在
(逗号空间)上拆分,而不仅仅是
,根据最近对问题的编辑。@Martin,你可能不应该使用“10x”,至少是math.stackexchange.com,除非你想把人搞糊涂。@Martin-一个建议:虽然我非常喜欢正则表达式,但这肯定是更好的答案,如果你能避免使用正则表达式,你应该接受它。这是更准确的答案再次感谢,@Tim Pietzcker你能给我们提供一些它是如何工作的吗?@Martin:我希望你不会在生产代码中使用它。正则表达式不是实现这一点的合适工具,即使它可以工作。这是非常低效的。我见过一个似乎有效的(我猜是扰流板):DFA转换成稍微简单的正则表达式([0369]|([147][0369]*[258])|([258]|[147][0369]*[147])([0369]*[258][0369]*[147])([147]|[258][0369]*[258])*[258])*。:@MichaelBoger:不,它没有-再次检查这个答案是否更准确,谢谢,@Tim Pietzcker你能给我们提供一些它是如何工作的吗?@Martin:我希望你不会在生产代码中使用它。正则表达式不是实现这一点的合适工具,即使它可以工作。这是非常低效的。我见过一个似乎有效的(我猜是扰流板):DFA转换成稍微简单的正则表达式
([0369]|([147][0369]*[258])|([258]|[147][0369]*[147])([0369]*[258][0369]*[147])([147]|[258][0369]*[258])*[258])*。
:@MichaelBoger:不,它没有-查看它