We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
AWS::Events::Rule ScheduleExpression: "cron(* 1 * * * *)" 
*cfn-lint version: (cfn-lint 0.27.5)*

*Description of issue.*

```
  EventRule:
    Type: "AWS::Events::Rule"
    Properties:
      ScheduleExpression: "cron(* 1 * * * *)" 
      State: "ENABLED"
      Targets:
        - Arn: !Ref Foo
          Id: "Foo"
          RoleArn: !GetAtt FooArn.Arn
```

Check should be probably in:

[src/cfnlint/rules/resources/events/RuleScheduleExpression.py](https://github.com/aws-cloudformation/cfn-python-lint/blob/master/src/cfnlint/rules/resources/events/RuleScheduleExpression.py)

The above `ScheduleExpression` is invalid (need a value for minute if hour is set). For example `cron(0 1 * * ? *)`

---

[Schedule Expressions for Rules documentation](https://docs.aws.amazon.com/eventbridge/latest/userguide/scheduled-events.html)

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `src/cfnlint/rules/resources/events/RuleScheduleExpression.py`
Content:
```
1 """
2 Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
3 SPDX-License-Identifier: MIT-0
4 """
5 from cfnlint.rules import CloudFormationLintRule
6 from cfnlint.rules import RuleMatch
7 
8 
9 class RuleScheduleExpression(CloudFormationLintRule):
10     """Validate AWS Events Schedule expression format"""
11     id = 'E3027'
12     shortdesc = 'Validate AWS Event ScheduleExpression format'
13     description = 'Validate the formation of the AWS::Event ScheduleExpression'
14     source_url = 'https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html'
15     tags = ['resources', 'events']
16 
17     def initialize(self, cfn):
18         """Initialize the rule"""
19         self.resource_property_types = ['AWS::Events::Rule']
20 
21     def check_rate(self, value, path):
22         """Check Rate configuration"""
23         matches = []
24         # Extract the expression from rate(XXX)
25         rate_expression = value[value.find('(')+1:value.find(')')]
26 
27         if not rate_expression:
28             matches.append(RuleMatch(path, 'Rate value of ScheduleExpression cannot be empty'))
29         else:
30             # Rate format: rate(Value Unit)
31             items = rate_expression.split(' ')
32 
33             if len(items) != 2:
34                 message = 'Rate expression must contain 2 elements (Value Unit), rate contains {} elements'
35                 matches.append(RuleMatch(path, message.format(len(items))))
36             else:
37                 # Check the Value
38                 if not items[0].isdigit():
39                     message = 'Rate Value ({}) should be of type Integer.'
40                     extra_args = {'actual_type': type(items[0]).__name__, 'expected_type': int.__name__}
41                     matches.append(RuleMatch(path, message.format(items[0]), **extra_args))
42 
43         return matches
44 
45     def check_cron(self, value, path):
46         """Check Cron configuration"""
47         matches = []
48         # Extract the expression from cron(XXX)
49         cron_expression = value[value.find('(')+1:value.find(')')]
50 
51         if not cron_expression:
52             matches.append(RuleMatch(path, 'Cron value of ScheduleExpression cannot be empty'))
53         else:
54             # Rate format: cron(Minutes Hours Day-of-month Month Day-of-week Year)
55             items = cron_expression.split(' ')
56 
57             if len(items) != 6:
58                 message = 'Cron expression must contain 6 elements (Minutes Hours Day-of-month Month Day-of-week Year), cron contains {} elements'
59                 matches.append(RuleMatch(path, message.format(len(items))))
60 
61         return matches
62 
63     def check_value(self, value, path):
64         """Count ScheduledExpression value"""
65         matches = []
66 
67         # Value is either "cron()" or "rate()"
68         if value.startswith('rate(') and value.endswith(')'):
69             matches.extend(self.check_rate(value, path))
70         elif value.startswith('cron(') and value.endswith(')'):
71             matches.extend(self.check_cron(value, path))
72         else:
73             message = 'Invalid ScheduledExpression specified ({}). Value has to be either cron() or rate()'
74             matches.append(RuleMatch(path, message.format(value)))
75 
76         return matches
77 
78     def match_resource_properties(self, properties, _, path, cfn):
79         """Check CloudFormation Properties"""
80         matches = []
81 
82         matches.extend(
83             cfn.check_value(
84                 obj=properties, key='ScheduleExpression',
85                 path=path[:],
86                 check_value=self.check_value
87             ))
88 
89         return matches
90
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/src/cfnlint/rules/resources/events/RuleScheduleExpression.py b/src/cfnlint/rules/resources/events/RuleScheduleExpression.py
--- a/src/cfnlint/rules/resources/events/RuleScheduleExpression.py
+++ b/src/cfnlint/rules/resources/events/RuleScheduleExpression.py
@@ -37,7 +37,8 @@
                 # Check the Value
                 if not items[0].isdigit():
                     message = 'Rate Value ({}) should be of type Integer.'
-                    extra_args = {'actual_type': type(items[0]).__name__, 'expected_type': int.__name__}
+                    extra_args = {'actual_type': type(
+                        items[0]).__name__, 'expected_type': int.__name__}
                     matches.append(RuleMatch(path, message.format(items[0]), **extra_args))
 
         return matches
@@ -57,6 +58,12 @@
             if len(items) != 6:
                 message = 'Cron expression must contain 6 elements (Minutes Hours Day-of-month Month Day-of-week Year), cron contains {} elements'
                 matches.append(RuleMatch(path, message.format(len(items))))
+                return matches
+
+            _, _, day_of_month, _, day_of_week, _ = cron_expression.split(' ')
+            if day_of_month != '?' and day_of_week != '?':
+                matches.append(RuleMatch(
+                    path, 'Don\'t specify the Day-of-month and Day-of-week fields in the same cron expression'))
 
         return matches

{"golden_diff": "diff --git a/src/cfnlint/rules/resources/events/RuleScheduleExpression.py b/src/cfnlint/rules/resources/events/RuleScheduleExpression.py\n--- a/src/cfnlint/rules/resources/events/RuleScheduleExpression.py\n+++ b/src/cfnlint/rules/resources/events/RuleScheduleExpression.py\n@@ -37,7 +37,8 @@\n                 # Check the Value\n                 if not items[0].isdigit():\n                     message = 'Rate Value ({}) should be of type Integer.'\n-                    extra_args = {'actual_type': type(items[0]).__name__, 'expected_type': int.__name__}\n+                    extra_args = {'actual_type': type(\n+                        items[0]).__name__, 'expected_type': int.__name__}\n                     matches.append(RuleMatch(path, message.format(items[0]), **extra_args))\n \n         return matches\n@@ -57,6 +58,12 @@\n             if len(items) != 6:\n                 message = 'Cron expression must contain 6 elements (Minutes Hours Day-of-month Month Day-of-week Year), cron contains {} elements'\n                 matches.append(RuleMatch(path, message.format(len(items))))\n+                return matches\n+\n+            _, _, day_of_month, _, day_of_week, _ = cron_expression.split(' ')\n+            if day_of_month != '?' and day_of_week != '?':\n+                matches.append(RuleMatch(\n+                    path, 'Don\\'t specify the Day-of-month and Day-of-week fields in the same cron expression'))\n \n         return matches\n", "issue": "AWS::Events::Rule ScheduleExpression: \"cron(* 1 * * * *)\" \n*cfn-lint version: (cfn-lint 0.27.5)*\r\n\r\n*Description of issue.*\r\n\r\n```\r\n  EventRule:\r\n    Type: \"AWS::Events::Rule\"\r\n    Properties:\r\n      ScheduleExpression: \"cron(* 1 * * * *)\" \r\n      State: \"ENABLED\"\r\n      Targets:\r\n        - Arn: !Ref Foo\r\n          Id: \"Foo\"\r\n          RoleArn: !GetAtt FooArn.Arn\r\n```\r\n\r\nCheck should be probably in:\r\n\r\n[src/cfnlint/rules/resources/events/RuleScheduleExpression.py](https://github.com/aws-cloudformation/cfn-python-lint/blob/master/src/cfnlint/rules/resources/events/RuleScheduleExpression.py)\r\n\r\nThe above `ScheduleExpression` is invalid (need a value for minute if hour is set). For example `cron(0 1 * * ? *)`\r\n\r\n---\r\n\r\n[Schedule Expressions for Rules documentation](https://docs.aws.amazon.com/eventbridge/latest/userguide/scheduled-events.html)\n", "before_files": [{"content": "\"\"\"\nCopyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.\nSPDX-License-Identifier: MIT-0\n\"\"\"\nfrom cfnlint.rules import CloudFormationLintRule\nfrom cfnlint.rules import RuleMatch\n\n\nclass RuleScheduleExpression(CloudFormationLintRule):\n    \"\"\"Validate AWS Events Schedule expression format\"\"\"\n    id = 'E3027'\n    shortdesc = 'Validate AWS Event ScheduleExpression format'\n    description = 'Validate the formation of the AWS::Event ScheduleExpression'\n    source_url = 'https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html'\n    tags = ['resources', 'events']\n\n    def initialize(self, cfn):\n        \"\"\"Initialize the rule\"\"\"\n        self.resource_property_types = ['AWS::Events::Rule']\n\n    def check_rate(self, value, path):\n        \"\"\"Check Rate configuration\"\"\"\n        matches = []\n        # Extract the expression from rate(XXX)\n        rate_expression = value[value.find('(')+1:value.find(')')]\n\n        if not rate_expression:\n            matches.append(RuleMatch(path, 'Rate value of ScheduleExpression cannot be empty'))\n        else:\n            # Rate format: rate(Value Unit)\n            items = rate_expression.split(' ')\n\n            if len(items) != 2:\n                message = 'Rate expression must contain 2 elements (Value Unit), rate contains {} elements'\n                matches.append(RuleMatch(path, message.format(len(items))))\n            else:\n                # Check the Value\n                if not items[0].isdigit():\n                    message = 'Rate Value ({}) should be of type Integer.'\n                    extra_args = {'actual_type': type(items[0]).__name__, 'expected_type': int.__name__}\n                    matches.append(RuleMatch(path, message.format(items[0]), **extra_args))\n\n        return matches\n\n    def check_cron(self, value, path):\n        \"\"\"Check Cron configuration\"\"\"\n        matches = []\n        # Extract the expression from cron(XXX)\n        cron_expression = value[value.find('(')+1:value.find(')')]\n\n        if not cron_expression:\n            matches.append(RuleMatch(path, 'Cron value of ScheduleExpression cannot be empty'))\n        else:\n            # Rate format: cron(Minutes Hours Day-of-month Month Day-of-week Year)\n            items = cron_expression.split(' ')\n\n            if len(items) != 6:\n                message = 'Cron expression must contain 6 elements (Minutes Hours Day-of-month Month Day-of-week Year), cron contains {} elements'\n                matches.append(RuleMatch(path, message.format(len(items))))\n\n        return matches\n\n    def check_value(self, value, path):\n        \"\"\"Count ScheduledExpression value\"\"\"\n        matches = []\n\n        # Value is either \"cron()\" or \"rate()\"\n        if value.startswith('rate(') and value.endswith(')'):\n            matches.extend(self.check_rate(value, path))\n        elif value.startswith('cron(') and value.endswith(')'):\n            matches.extend(self.check_cron(value, path))\n        else:\n            message = 'Invalid ScheduledExpression specified ({}). Value has to be either cron() or rate()'\n            matches.append(RuleMatch(path, message.format(value)))\n\n        return matches\n\n    def match_resource_properties(self, properties, _, path, cfn):\n        \"\"\"Check CloudFormation Properties\"\"\"\n        matches = []\n\n        matches.extend(\n            cfn.check_value(\n                obj=properties, key='ScheduleExpression',\n                path=path[:],\n                check_value=self.check_value\n            ))\n\n        return matches\n", "path": "src/cfnlint/rules/resources/events/RuleScheduleExpression.py"}], "after_files": [{"content": "\"\"\"\nCopyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.\nSPDX-License-Identifier: MIT-0\n\"\"\"\nfrom cfnlint.rules import CloudFormationLintRule\nfrom cfnlint.rules import RuleMatch\n\n\nclass RuleScheduleExpression(CloudFormationLintRule):\n    \"\"\"Validate AWS Events Schedule expression format\"\"\"\n    id = 'E3027'\n    shortdesc = 'Validate AWS Event ScheduleExpression format'\n    description = 'Validate the formation of the AWS::Event ScheduleExpression'\n    source_url = 'https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html'\n    tags = ['resources', 'events']\n\n    def initialize(self, cfn):\n        \"\"\"Initialize the rule\"\"\"\n        self.resource_property_types = ['AWS::Events::Rule']\n\n    def check_rate(self, value, path):\n        \"\"\"Check Rate configuration\"\"\"\n        matches = []\n        # Extract the expression from rate(XXX)\n        rate_expression = value[value.find('(')+1:value.find(')')]\n\n        if not rate_expression:\n            matches.append(RuleMatch(path, 'Rate value of ScheduleExpression cannot be empty'))\n        else:\n            # Rate format: rate(Value Unit)\n            items = rate_expression.split(' ')\n\n            if len(items) != 2:\n                message = 'Rate expression must contain 2 elements (Value Unit), rate contains {} elements'\n                matches.append(RuleMatch(path, message.format(len(items))))\n            else:\n                # Check the Value\n                if not items[0].isdigit():\n                    message = 'Rate Value ({}) should be of type Integer.'\n                    extra_args = {'actual_type': type(\n                        items[0]).__name__, 'expected_type': int.__name__}\n                    matches.append(RuleMatch(path, message.format(items[0]), **extra_args))\n\n        return matches\n\n    def check_cron(self, value, path):\n        \"\"\"Check Cron configuration\"\"\"\n        matches = []\n        # Extract the expression from cron(XXX)\n        cron_expression = value[value.find('(')+1:value.find(')')]\n\n        if not cron_expression:\n            matches.append(RuleMatch(path, 'Cron value of ScheduleExpression cannot be empty'))\n        else:\n            # Rate format: cron(Minutes Hours Day-of-month Month Day-of-week Year)\n            items = cron_expression.split(' ')\n\n            if len(items) != 6:\n                message = 'Cron expression must contain 6 elements (Minutes Hours Day-of-month Month Day-of-week Year), cron contains {} elements'\n                matches.append(RuleMatch(path, message.format(len(items))))\n                return matches\n\n            _, _, day_of_month, _, day_of_week, _ = cron_expression.split(' ')\n            if day_of_month != '?' and day_of_week != '?':\n                matches.append(RuleMatch(\n                    path, 'Don\\'t specify the Day-of-month and Day-of-week fields in the same cron expression'))\n\n        return matches\n\n    def check_value(self, value, path):\n        \"\"\"Count ScheduledExpression value\"\"\"\n        matches = []\n\n        # Value is either \"cron()\" or \"rate()\"\n        if value.startswith('rate(') and value.endswith(')'):\n            matches.extend(self.check_rate(value, path))\n        elif value.startswith('cron(') and value.endswith(')'):\n            matches.extend(self.check_cron(value, path))\n        else:\n            message = 'Invalid ScheduledExpression specified ({}). Value has to be either cron() or rate()'\n            matches.append(RuleMatch(path, message.format(value)))\n\n        return matches\n\n    def match_resource_properties(self, properties, _, path, cfn):\n        \"\"\"Check CloudFormation Properties\"\"\"\n        matches = []\n\n        matches.extend(\n            cfn.check_value(\n                obj=properties, key='ScheduleExpression',\n                path=path[:],\n                check_value=self.check_value\n            ))\n\n        return matches\n", "path": "src/cfnlint/rules/resources/events/RuleScheduleExpression.py"}]}